Bei einem gemeinsamen (virtuellen) Frühstück ein paar Tipps und Tricks rund um Sage b7 erfahren? - Termin verpasst? - Jetzt nachlesen!
Beim nächsten b7-Anwender-Frühstück mal wieder ein Programmierthema:
in bsl programmieren mit komplexen Datentypen.
Klingt kompliziert - ist aber durchaus auch für Anfänger interessant.
Wir erklären die Grundlagen und arbeiten uns dann schrittweise in den Folgeterminen bis zum Verarbeiten von REST-Webservices vor.
Beispiel:
CDT-Definition
#-------------------------------------------------------------------------------
# 2023-10-24 Sven Wendte
# Anwenderfrühstück 2023-10-26
#-------------------------------------------------------------------------------
define benennung {
string ben,
string ben1,
string werkstoff,
string abmessung
}
define teil_sprache {
string identnr,
string var,
string lang_ext,
int fi_nr,
string abmessung,
int aendnr,
string ben,
string ben1,
date dataen,
date datneu,
string klasse,
string kurz_ben,
string mc_var,
string norm,
string normnr,
int updatenr,
string useraen,
string userneu,
string uuid,
string werkstoff,
}
define teile_sprache {
teil_sprache[0] teil_sprache
}
define teile_such {
string identnr,
string var,
string lang_ext,
int fi_nr,
}
BSL-Code
#-------------------------------------------------------------------------------
# 2023-10-24 Sven Wendte
# Anwenderfrühstück 2023-10-26
#-------------------------------------------------------------------------------
include saw_20231026.cdt
#-------------------------------------------------------------------------------
/*
unload saw_20231026.bsl
public saw_20231026.bsl
string benL = saw_20231026_1('11000011')
msg emsg "benL <:benL>"
*/
#-------------------------------------------------------------------------------
string proc saw_20231026_1(identnrP)
{
// Funktion zur Ermittlung der Benennung eines Teils
// Diese Funktion ist sehr individuell:
// - nur eine Firma
// - Kein Einsatz Variantenmanagement
// - Ausgabesprache deutsch
string benL
dbms alias benL
dbms sql select g0402.ben \
from g0402 \
where g0402.fi_nr = 1 \
and g0402.identnr = :+identnrP \
and g0402.lang_ext = 'de_de'
dbms alias
return benL
}
#-------------------------------------------------------------------------------
/*
unload saw_20231026.bsl
public saw_20231026.bsl
string benL = saw_20231026_2('11000011')
msg emsg "benL <:benL>"
*/
#-------------------------------------------------------------------------------
string proc saw_20231026_2(identnrP)
{
// Ausgabe soll erweitert werden auf zweite Benennungszeile
string benL
string ben1L
dbms alias benL \
, ben1L
dbms sql select g0402.ben \
, g0402.ben1 \
from g0402 \
where g0402.fi_nr = 1 \
and g0402.identnr = :+identnrP \
and g0402.lang_ext = 'de_de'
dbms alias
return benL ## "|" ## ben1L
// oder schreiben in LDB-Felder und von dort abholen
}
#-------------------------------------------------------------------------------
/*
unload saw_20231026.bsl
public saw_20231026.bsl
cdt teilL = saw_20231026_3('11000011')
msg emsg "teilL=>ben <:(teilL=>ben)>"
msg emsg "teilL=>ben1 <:(teilL=>ben1)>"
*/
#-------------------------------------------------------------------------------
cdt proc saw_20231026_3(identnrP)
{
// Benennungen in eine benutzerdefinierte Variable schreiben (CDT - Complex-Data-Type)
cdt benennungL
benennungL = bu_cdt_new("benennung")
dbms alias benennungL=>ben \
, benennungL=>ben1 \
, benennungL=>werkstoff
dbms sql select g0402.ben \
, g0402.ben1 \
, g0402.werkstoff \
from g0402 \
where g0402.fi_nr = 1 \
and g0402.identnr = :+identnrP \
and g0402.lang_ext = 'de_de'
dbms alias
return benennungL
}
#-------------------------------------------------------------------------------
/*
unload saw_20231026.bsl
public saw_20231026.bsl
cdt teilL = saw_20231026_4('11000011')
msg emsg "teilL=>ben <:(teilL=>ben)>"
msg emsg "teilL=>ben1 <:(teilL=>ben1)>"
*/
#-------------------------------------------------------------------------------
cdt proc saw_20231026_4(identnrP)
{
// kompletten Primary-Key der Tabelle g0402 verwenden
cdt benennungL
benennungL = bu_cdt_new("benennung")
dbms alias benennungL=>ben \
, benennungL=>ben1
dbms sql select g0402.ben \
, g0402.ben1 \
from g0402 \
where g0402.fi_nr = :+FI_G000 \
and g0402.identnr = :+identnrP \
and g0402.var = :+NULL \
and g0402.lang_ext = :+LANG_EXT
dbms alias
return benennungL
}
#-------------------------------------------------------------------------------
/*
unload saw_20231026.bsl
public saw_20231026.bsl
cdt teilL = saw_20231026_5('11000011', NULL, LANG_EXT, FI_G000)
msg emsg "teilL=>ben <:(teilL=>ben)>"
msg emsg "teilL=>ben1 <:(teilL=>ben1)>"
*/
#-------------------------------------------------------------------------------
cdt proc saw_20231026_5(identnrP, varP, lang_extP, fi_nrP)
{
// mit PK in Übergabeparameter
cdt benennungL
benennungL = bu_cdt_new("benennung")
dbms alias benennungL=>ben \
, benennungL=>ben1
dbms sql select g0402.ben \
, g0402.ben1 \
from g0402 \
where g0402.fi_nr = :+fi_nrP \
and g0402.identnr = :+identnrP \
and g0402.var = :+varP \
and g0402.lang_ext = :+lang_extP
dbms alias
return benennungL
}
#-------------------------------------------------------------------------------
/*
unload saw_20231026.bsl
public saw_20231026.bsl
teil_sprache teil_spracheL
teil_spracheL = bu_cdt_new("teil_sprache")
teil_spracheL=>fi_nr = FI_G000
teil_spracheL=>identnr = '11000011'
teil_spracheL=>var = NULL
teil_spracheL=>lang_ext = LANG_EXT
teil_spracheL = saw_20231026_6(teil_spracheL)
msg emsg "teil_spracheL=>ben <:(teil_spracheL=>ben)>"
msg emsg "teil_spracheL=>ben1 <:(teil_spracheL=>ben1)>"
*/
#-------------------------------------------------------------------------------
teil_sprache proc saw_20231026_6(teil_sprache teil_spracheP)
{
// Keydaten im CDT setzen, CDT im select-Statement füllen
// und zurückgeben
dbms alias teil_spracheP=>ben \
, teil_spracheP=>ben1
dbms sql select g0402.ben \
, g0402.ben1 \
from g0402 \
where g0402.fi_nr = :+teil_spracheP=>fi_nr \
and g0402.identnr = :+teil_spracheP=>identnr \
and g0402.var = :+teil_spracheP=>var \
and g0402.lang_ext = :+teil_spracheP=>lang_ext
dbms alias
return teil_spracheP
}
#-------------------------------------------------------------------------------
/*
unload saw_20231026.bsl
public saw_20231026.bsl
vars cdtL = bu_cdbi_new("g0402")
cdtL=>fi_nr = FI_G000
cdtL=>identnr = '11000011'
cdtL=>var = NULL
cdtL=>lang_ext = LANG_EXT
cdtL = saw_20231026_7(cdtL)
msg emsg "cdtL=>ben <:(cdtL=>ben)>"
msg emsg "cdtL=>ben1 <:(cdtL=>ben1)>"
*/
#-------------------------------------------------------------------------------
cdt proc saw_20231026_7(cdt g0402P)
{
// Lösung mit b7-CDBI (Complex-DataBase-Interface)
vars rcL
rcL = bu_cdbi_read(g0402P)
return g0402P
}
#-------------------------------------------------------------------------------
/*
unload saw_20231026.bsl
public saw_20231026.bsl
call saw_20231026_8()
*/
#-------------------------------------------------------------------------------
int proc saw_20231026_8()
{
// mehrere Teile selektieren
int anzahl_datensaetzeL
int i1
// CDT für Suchbegriffe
teile_such teile_suchL
teile_suchL = bu_cdt_new("teile_such")
teile_suchL=>fi_nr = FI_G000
teile_suchL=>identnr = '110000%'
teile_suchL=>var = NULL
teile_suchL=>lang_ext = LANG_EXT
// CDT (Array) für Suchergebnis
teile_sprache teile_spracheL
teile_spracheL = bu_cdt_new("teile_sprache")
// Daten ermitteln, Suchbegriffe übergeben
teile_spracheL = saw_20231026_9(teile_suchL)
// Daten ausgeben
anzahl_datensaetzeL = md_get_arraysize(teile_spracheL , "teil_sprache")
for i1 = 1 while i1 <= anzahl_datensaetzeL {
msg emsg ":i1. teil_spracheL=>identnr " ## teile_spracheL=>teil_sprache[i1]=>identnr ## "\n" ## \
" teil_spracheL=>ben " ## teile_spracheL=>teil_sprache[i1]=>ben ## "\n" ## \
" teil_spracheL=>ben1 " ## teile_spracheL=>teil_sprache[i1]=>ben1
}
// CDT-Dump ausgeben
//msg emsg bu_cdt_dump(teile_spracheL)
return OK
}
#-------------------------------------------------------------------------------
teile_sprache proc saw_20231026_9(teile_suchP)
{
// CDT zur Aufnahme eines Datensatzes
teil_sprache teil_spracheL
teil_spracheL = bu_cdt_new("teil_sprache")
// CDT zur Aufnahme der Liste
teile_sprache teile_spracheL
teile_spracheL = bu_cdt_new("teile_sprache")
if (!dm_is_cursor("cursor_teile_sprache") == TRUE)
{
// Such-Cursor deklarieren
dbms declare cursor_teile_sprache cursor for \
select g0402.identnr \
, g0402.var \
, g0402.lang_ext \
, g0402.fi_nr \
, g0402.ben \
, g0402.ben1 \
from g0402 \
where g0402.fi_nr = :+teile_suchP=>fi_nr \
and g0402.identnr like :+teile_suchP=>identnr \
and g0402.var like :+teile_suchP=>var \
and g0402.lang_ext like :+teile_suchP=>lang_ext
// Ziel-CDT zuweisen
dbms with cursor cursor_teile_sprache alias teil_spracheL=>identnr \
, teil_spracheL=>var \
, teil_spracheL=>lang_ext \
, teil_spracheL=>fi_nr \
, teil_spracheL=>ben \
, teil_spracheL=>ben1
}
// Such-Cursor ausführen
dbms with cursor cursor_teile_sprache execute
while SQL_CODE == SQL_OK
{
// Datensatz an Liste anfügen
call bu_cdt_add_to_array(teile_spracheL, "teil_sprache", teil_spracheL)
// neues CDT zur Aufnahme des nächsten Datensatzes
teil_spracheL = bu_cdt_new("teil_sprache")
// nächsten Datensatz holen
dbms with cursor cursor_teile_sprache continue
}
if (dm_is_cursor("cursor_teile_sprache") == TRUE)
{
// Such-Cursor schließen
dbms close cursor cursor_teile_sprache
}
return teile_spracheL
}