b7-Anwender-Frühstück: Grundlagen komplexe Datentypen
b7-Anwender-Frühstück: Grundlagen komplexe Datentypen
Veranstaltungsdatum:
 
26.10.2023
 
8:30
 Uhr
 
16.11.2023

Bei einem gemeinsamen (virtuellen) Frühstück ein paar Tipps und Tricks rund um Sage b7 erfahren? - Termin verpasst? - Jetzt nachlesen!

Thema:

  • Grundlagen komplexen Datentypen

Beschreibung:

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.

Hinweise zur Veranstaltung:      

  • Die Teilnahme am b7-Anwender-Frühstück ist kostenlos.
  • Die Teams-Sitzungen finden an jedem vierten Donnerstag im Monat statt von 08:30 bis 09:30 Uhr. Fällt der Termin auf einen Feiertag, fällt diese Sitzung aus.
  • In den Sitzungen kann Werbung der SuA-Wendte GmbH oder Drittanbietern enthalten sein.
  • Die gezeigten Lösungen und Beispiele beziehen sich auf den aktuellen Sage b7 Release. Soweit Unterschiede zu anderen Releases bekannt sind, wird auf diese eingegangen.
  • Im Anschluss an den Vortrag verbleiben etwa 15 bis 20 Minuten, um Fragen (auch  zu anderen Themen) zu stellen.

Nachbearbeitung:

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
}