[{"data":1,"prerenderedAt":731},["ShallowReactive",2],{"blog-\u002Fblog\u002F02-bkpf-bseg-join":3,"blog-surround-\u002Fblog\u002F02-bkpf-bseg-join":724,"blog-related-\u002Fblog\u002F02-bkpf-bseg-join":730},{"id":4,"title":5,"audience":6,"body":7,"cluster":6,"date":697,"description":698,"draft":699,"extension":700,"factCheckedAt":6,"faq":701,"featured":699,"language":87,"meta":711,"navigation":712,"order":6,"originalAsset":6,"path":713,"pillar":6,"primaryKeyword":714,"relatedProject":6,"releaseScope":6,"reviewCycle":715,"reviewStatus":716,"reviewedBy":717,"searchIntent":6,"seo":718,"sources":6,"stem":719,"tags":720,"type":15,"updated":6,"__hash__":723},"blog\u002Fblog\u002F02-bkpf-bseg-join.md","Joining BKPF and BSEG without losing your mind",null,{"type":8,"value":9,"toc":692},"minimark",[10,23,28,36,64,81,406,410,431,641,665,669,688],[11,12,13,14,18,19,22],"p",{},"In SAP FI, an accounting document is split across two tables: ",[15,16,17],"code",{},"BKPF"," holds the header (one row per document) and ",[15,20,21],{},"BSEG"," holds the line items (many rows per document). Get the join keys wrong and you either duplicate rows or silently drop postings from other company codes.",[24,25,27],"h2",{"id":26},"the-four-keys","The four keys",[11,29,30,31,35],{},"A document is only unique across ",[32,33,34],"strong",{},"all four"," of these together:",[37,38,39,46,52,58],"ul",{},[40,41,42,45],"li",{},[15,43,44],{},"MANDT"," — client",[40,47,48,51],{},[15,49,50],{},"BUKRS"," — company code",[40,53,54,57],{},[15,55,56],{},"BELNR"," — document number",[40,59,60,63],{},[15,61,62],{},"GJAHR"," — fiscal year",[11,65,66,67,69,70,72,73,75,76,80],{},"Leaving out ",[15,68,50],{}," or ",[15,71,62],{}," is the classic mistake: ",[15,74,56],{}," is only unique ",[77,78,79],"em",{},"within"," a company code and fiscal year, so a two-field join fans out across every company code that happens to reuse the same document number.",[82,83,89],"pre",{"className":84,"code":85,"filename":86,"language":87,"meta":88,"style":88},"language-sql shiki shiki-themes github-light github-dark","SELECT\n  h.bukrs,\n  h.belnr,\n  h.gjahr,\n  h.blart,   -- document type\n  h.budat,   -- posting date\n  l.buzei,   -- line item number\n  l.hkont,   -- G\u002FL account\n  l.shkzg,   -- debit\u002Fcredit indicator (S\u002FH)\n  l.dmbtr    -- amount in local currency\nFROM bkpf AS h\nJOIN bseg AS l\n  ON  l.mandt = h.mandt\n  AND l.bukrs = h.bukrs\n  AND l.belnr = h.belnr\n  AND l.gjahr = h.gjahr\nWHERE h.bukrs = '1000'\n  AND h.gjahr = '2026'\nORDER BY h.belnr, l.buzei;\n","Header joined to line items on the full key","sql","",[15,90,91,100,117,129,141,158,173,189,204,219,232,247,261,285,307,327,347,365,381],{"__ignoreMap":88},[92,93,96],"span",{"class":94,"line":95},"line",1,[92,97,99],{"class":98},"szBVR","SELECT\n",[92,101,103,107,111,114],{"class":94,"line":102},2,[92,104,106],{"class":105},"sj4cs","  h",[92,108,110],{"class":109},"sVt8B",".",[92,112,113],{"class":105},"bukrs",[92,115,116],{"class":109},",\n",[92,118,120,122,124,127],{"class":94,"line":119},3,[92,121,106],{"class":105},[92,123,110],{"class":109},[92,125,126],{"class":105},"belnr",[92,128,116],{"class":109},[92,130,132,134,136,139],{"class":94,"line":131},4,[92,133,106],{"class":105},[92,135,110],{"class":109},[92,137,138],{"class":105},"gjahr",[92,140,116],{"class":109},[92,142,144,146,148,151,154],{"class":94,"line":143},5,[92,145,106],{"class":105},[92,147,110],{"class":109},[92,149,150],{"class":105},"blart",[92,152,153],{"class":109},",   ",[92,155,157],{"class":156},"sJ8bj","-- document type\n",[92,159,161,163,165,168,170],{"class":94,"line":160},6,[92,162,106],{"class":105},[92,164,110],{"class":109},[92,166,167],{"class":105},"budat",[92,169,153],{"class":109},[92,171,172],{"class":156},"-- posting date\n",[92,174,176,179,181,184,186],{"class":94,"line":175},7,[92,177,178],{"class":105},"  l",[92,180,110],{"class":109},[92,182,183],{"class":105},"buzei",[92,185,153],{"class":109},[92,187,188],{"class":156},"-- line item number\n",[92,190,192,194,196,199,201],{"class":94,"line":191},8,[92,193,178],{"class":105},[92,195,110],{"class":109},[92,197,198],{"class":105},"hkont",[92,200,153],{"class":109},[92,202,203],{"class":156},"-- G\u002FL account\n",[92,205,207,209,211,214,216],{"class":94,"line":206},9,[92,208,178],{"class":105},[92,210,110],{"class":109},[92,212,213],{"class":105},"shkzg",[92,215,153],{"class":109},[92,217,218],{"class":156},"-- debit\u002Fcredit indicator (S\u002FH)\n",[92,220,222,224,226,229],{"class":94,"line":221},10,[92,223,178],{"class":105},[92,225,110],{"class":109},[92,227,228],{"class":105},"dmbtr",[92,230,231],{"class":156},"    -- amount in local currency\n",[92,233,235,238,241,244],{"class":94,"line":234},11,[92,236,237],{"class":98},"FROM",[92,239,240],{"class":109}," bkpf ",[92,242,243],{"class":98},"AS",[92,245,246],{"class":109}," h\n",[92,248,250,253,256,258],{"class":94,"line":249},12,[92,251,252],{"class":98},"JOIN",[92,254,255],{"class":109}," bseg ",[92,257,243],{"class":98},[92,259,260],{"class":109}," l\n",[92,262,264,267,269,271,274,277,280,282],{"class":94,"line":263},13,[92,265,266],{"class":98},"  ON",[92,268,178],{"class":105},[92,270,110],{"class":109},[92,272,273],{"class":105},"mandt",[92,275,276],{"class":98}," =",[92,278,279],{"class":105}," h",[92,281,110],{"class":109},[92,283,284],{"class":105},"mandt\n",[92,286,288,291,294,296,298,300,302,304],{"class":94,"line":287},14,[92,289,290],{"class":98},"  AND",[92,292,293],{"class":105}," l",[92,295,110],{"class":109},[92,297,113],{"class":105},[92,299,276],{"class":98},[92,301,279],{"class":105},[92,303,110],{"class":109},[92,305,306],{"class":105},"bukrs\n",[92,308,310,312,314,316,318,320,322,324],{"class":94,"line":309},15,[92,311,290],{"class":98},[92,313,293],{"class":105},[92,315,110],{"class":109},[92,317,126],{"class":105},[92,319,276],{"class":98},[92,321,279],{"class":105},[92,323,110],{"class":109},[92,325,326],{"class":105},"belnr\n",[92,328,330,332,334,336,338,340,342,344],{"class":94,"line":329},16,[92,331,290],{"class":98},[92,333,293],{"class":105},[92,335,110],{"class":109},[92,337,138],{"class":105},[92,339,276],{"class":98},[92,341,279],{"class":105},[92,343,110],{"class":109},[92,345,346],{"class":105},"gjahr\n",[92,348,350,353,355,357,359,361],{"class":94,"line":349},17,[92,351,352],{"class":98},"WHERE",[92,354,279],{"class":105},[92,356,110],{"class":109},[92,358,113],{"class":105},[92,360,276],{"class":98},[92,362,364],{"class":363},"sZZnC"," '1000'\n",[92,366,368,370,372,374,376,378],{"class":94,"line":367},18,[92,369,290],{"class":98},[92,371,279],{"class":105},[92,373,110],{"class":109},[92,375,138],{"class":105},[92,377,276],{"class":98},[92,379,380],{"class":363}," '2026'\n",[92,382,384,387,389,391,393,396,399,401,403],{"class":94,"line":383},19,[92,385,386],{"class":98},"ORDER BY",[92,388,279],{"class":105},[92,390,110],{"class":109},[92,392,126],{"class":105},[92,394,395],{"class":109},", ",[92,397,398],{"class":105},"l",[92,400,110],{"class":109},[92,402,183],{"class":105},[92,404,405],{"class":109},";\n",[24,407,409],{"id":408},"amounts-are-unsigned-read-shkzg","Amounts are unsigned — read SHKZG",[11,411,412,415,416,419,420,423,424,427,428,430],{},[15,413,414],{},"DMBTR"," is always stored as a positive number. The debit\u002Fcredit direction lives in ",[15,417,418],{},"SHKZG"," (",[15,421,422],{},"S"," = debit, ",[15,425,426],{},"H"," = credit). If you sum ",[15,429,414],{}," directly you get gross turnover, not a net balance.",[82,432,435],{"className":84,"code":433,"filename":434,"language":87,"meta":88,"style":88},"SELECT\n  l.hkont,\n  SUM(CASE WHEN l.shkzg = 'H' THEN -l.dmbtr ELSE l.dmbtr END) AS net_local\nFROM bkpf AS h\nJOIN bseg AS l\n  ON  l.mandt = h.mandt\n  AND l.bukrs = h.bukrs\n  AND l.belnr = h.belnr\n  AND l.gjahr = h.gjahr\nWHERE h.bukrs = '1000'\n  AND h.gjahr = '2026'\nGROUP BY l.hkont;\n","Signed balance per G\u002FL account",[15,436,437,441,451,508,518,528,546,564,582,600,614,628],{"__ignoreMap":88},[92,438,439],{"class":94,"line":95},[92,440,99],{"class":98},[92,442,443,445,447,449],{"class":94,"line":102},[92,444,178],{"class":105},[92,446,110],{"class":109},[92,448,198],{"class":105},[92,450,116],{"class":109},[92,452,453,456,459,462,465,467,469,471,473,476,479,482,484,486,488,491,493,495,497,500,503,505],{"class":94,"line":119},[92,454,455],{"class":105},"  SUM",[92,457,458],{"class":109},"(",[92,460,461],{"class":98},"CASE",[92,463,464],{"class":98}," WHEN",[92,466,293],{"class":105},[92,468,110],{"class":109},[92,470,213],{"class":105},[92,472,276],{"class":98},[92,474,475],{"class":363}," 'H'",[92,477,478],{"class":98}," THEN",[92,480,481],{"class":98}," -",[92,483,398],{"class":105},[92,485,110],{"class":109},[92,487,228],{"class":105},[92,489,490],{"class":98}," ELSE",[92,492,293],{"class":105},[92,494,110],{"class":109},[92,496,228],{"class":105},[92,498,499],{"class":98}," END",[92,501,502],{"class":109},") ",[92,504,243],{"class":98},[92,506,507],{"class":109}," net_local\n",[92,509,510,512,514,516],{"class":94,"line":131},[92,511,237],{"class":98},[92,513,240],{"class":109},[92,515,243],{"class":98},[92,517,246],{"class":109},[92,519,520,522,524,526],{"class":94,"line":143},[92,521,252],{"class":98},[92,523,255],{"class":109},[92,525,243],{"class":98},[92,527,260],{"class":109},[92,529,530,532,534,536,538,540,542,544],{"class":94,"line":160},[92,531,266],{"class":98},[92,533,178],{"class":105},[92,535,110],{"class":109},[92,537,273],{"class":105},[92,539,276],{"class":98},[92,541,279],{"class":105},[92,543,110],{"class":109},[92,545,284],{"class":105},[92,547,548,550,552,554,556,558,560,562],{"class":94,"line":175},[92,549,290],{"class":98},[92,551,293],{"class":105},[92,553,110],{"class":109},[92,555,113],{"class":105},[92,557,276],{"class":98},[92,559,279],{"class":105},[92,561,110],{"class":109},[92,563,306],{"class":105},[92,565,566,568,570,572,574,576,578,580],{"class":94,"line":191},[92,567,290],{"class":98},[92,569,293],{"class":105},[92,571,110],{"class":109},[92,573,126],{"class":105},[92,575,276],{"class":98},[92,577,279],{"class":105},[92,579,110],{"class":109},[92,581,326],{"class":105},[92,583,584,586,588,590,592,594,596,598],{"class":94,"line":206},[92,585,290],{"class":98},[92,587,293],{"class":105},[92,589,110],{"class":109},[92,591,138],{"class":105},[92,593,276],{"class":98},[92,595,279],{"class":105},[92,597,110],{"class":109},[92,599,346],{"class":105},[92,601,602,604,606,608,610,612],{"class":94,"line":221},[92,603,352],{"class":98},[92,605,279],{"class":105},[92,607,110],{"class":109},[92,609,113],{"class":105},[92,611,276],{"class":98},[92,613,364],{"class":363},[92,615,616,618,620,622,624,626],{"class":94,"line":234},[92,617,290],{"class":98},[92,619,279],{"class":105},[92,621,110],{"class":109},[92,623,138],{"class":105},[92,625,276],{"class":98},[92,627,380],{"class":363},[92,629,630,633,635,637,639],{"class":94,"line":249},[92,631,632],{"class":98},"GROUP BY",[92,634,293],{"class":105},[92,636,110],{"class":109},[92,638,198],{"class":105},[92,640,405],{"class":109},[642,643,645],"callout",{"type":644},"tip",[11,646,647,649,650,653,654,395,657,395,659,661,662,110],{},[15,648,21],{}," is a cluster table in classic SAP — you can't always query it directly with open SQL. On S\u002F4HANA read from the ",[15,651,652],{},"ACDOCA"," universal journal instead, where each line already carries ",[15,655,656],{},"RBUKRS",[15,658,56],{},[15,660,62],{},", and a signed amount in ",[15,663,664],{},"HSL",[24,666,668],{"id":667},"when-not-to-use-it","When not to use it",[11,670,671,672,674,675,677,678,680,681,395,684,687],{},"For reporting, don't reconstruct balances from ",[15,673,17],{},"\u002F",[15,676,21],{}," line by line — that's what ",[15,679,652],{}," (S\u002F4) or the summary tables (",[15,682,683],{},"GLT0",[15,685,686],{},"FAGLFLEXT"," in classic) are for. Reach for the header\u002Fline join when you need document-level detail: audit trails, drill-downs, or reconciling a specific posting.",[689,690,691],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":88,"searchDepth":102,"depth":102,"links":693},[694,695,696],{"id":26,"depth":102,"text":27},{"id":408,"depth":102,"text":409},{"id":667,"depth":102,"text":668},"2026-05-20","The four key fields that link an SAP accounting document header to its line items — and why order matters.",false,"md",[702,705,708],{"question":703,"answer":704},"Which fields join BKPF to BSEG in SAP FI?","All four together — MANDT (client), BUKRS (company code), BELNR (document number), and GJAHR (fiscal year). BELNR is only unique within a company code and fiscal year, so a two-field join fans out across every company code that reuses the same document number.",{"question":706,"answer":707},"Why can't I just sum DMBTR to get an account balance?","DMBTR is always stored as a positive number; the debit\u002Fcredit direction lives in SHKZG (S = debit, H = credit). Summing DMBTR directly gives gross turnover, not a net balance — flip the sign for H rows, e.g. SUM(CASE WHEN shkzg = 'H' THEN -dmbtr ELSE dmbtr END).",{"question":709,"answer":710},"Should I still join BKPF and BSEG on S\u002F4HANA?","On S\u002F4HANA read from the ACDOCA universal journal instead, where each line already carries RBUKRS, BELNR, GJAHR and a signed amount (HSL). Reserve the BKPF\u002FBSEG join for document-level detail such as audit trails and drill-downs.",{},true,"\u002Fblog\u002F02-bkpf-bseg-join","BKPF BSEG join","annual","reviewed","Tan Gravam",{"title":5,"description":698},"blog\u002F02-bkpf-bseg-join",[721,722,87],"sap","finance","NcvQlIz40lKmHX3g9Q9x3MMAfFnMpYfa6jQuPP2Ug1E",[6,725],{"title":726,"path":727,"stem":728,"type":729,"language":6,"draft":699,"children":-1},"The friction tax on finance teams","\u002Fblog\u002F03-finance-team-friction","blog\u002F03-finance-team-friction","text",[],1785182339101]