Array von Funktion übergeben und weiterleiten

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
Quakobert
Rookie
Rookie
Beiträge: 5
Registriert: Do, 02. Apr 2015 15:41

Array von Funktion übergeben und weiterleiten

Beitrag von Quakobert »

Hallo, wie ihr seht bin ich neu hier. Hoffe mir kann jemand helfen.
Habe ein Browse / Auswahlfenster erstellt. Wollte dies so gestalten, dass ich die Datei mit kleinem Aufwand in jedem Programm das ein Browse braucht einbinden kann.
So, nun zum Problem:
Bei einer Funktion, die die Auswahl in SLEs einträgt, müsste ich ein Array in meine Main übergeben. Dieses Array benötige ich damit ein Eintrag in einer Datenbank geändert werden kann.
Die Werte in den SLEs werden ja geändert.
Kurzform: Function ( Auswahl in SLEs von Main eintragen) => Main ( Änderung der Werte in SLEs ) -> ÄndernButton drücken => Procedure (Überprüft ob alles Korrekt ist(Einträge usw.)) => Procedure (Ändert den Eintrag in DB)<- Hierfür benötige ich die anderen Werte, da er sonst ein neuen Eintrag macht und nicht Updatet

Falls ich noch den Code posten soll bitte sagen. Vorsicht der is sehr primitiv! Mach das noch nich so lange.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array von Funktion übergeben und weiterleiten

Beitrag von brandelh »

Welche Art von Programm baust du ( Console wie in Clipper bzw. EinFensterJeEXE GUI ODER ein Mehrere Clientfenster im Hauptfenster ?

Im ersten Fall kann ja immer nur ein Edit vorkommen, da wäre es am einfachsten eine Dateiweite STATIC zu verwenden, im zweiten Fall eine Instanzvariable der Clientfenster.

Code: Alles auswählen

STATIC aArray 
procedure MAIN()
    aArray := {}  // das ist das STATIC aArray()
    ...
return
function xyz()
    aArray ...       // das ist das STATIC aArray()
return nil
function Kill()
    aArray := {}  // das ist das STATIC aArray() ... das Array ist neu und leer, die Variable bleibt zugreifbar
return nil
ob das ganze aber wirklich Sinn macht kann ich aus der Beschreibung nicht erkennen.
Ich persönlich bevorzuge CLASS Code mit eigenem Quellcode für jedes Fenster.
Gruß
Hubert
Quakobert
Rookie
Rookie
Beiträge: 5
Registriert: Do, 02. Apr 2015 15:41

Re: Array von Funktion übergeben und weiterleiten

Beitrag von Quakobert »

Ok, es wird ein Programm um eine Datenbank zu verwalten. In diesem Fall möchte ich diese ändern.
Hier der Quellcode:

Code: Alles auswählen

 
********************************************************************************
* Hier wird angegeben in welche SLEs die Auswahl eingetragen wird
FUNCTION browseZuSle( parentDlg, oDlg_leer, oBrowse, memButton )
      LOCAL memUebergabe[6]     //Merkvariabel
      LOCAL mem
   //Eintrag in bestimmte SLEs
   IF memButton == 4
         memUebergabe[1] := FieldGet(1)
         parentDlg:sleFirmenNr:setData(ALLTRIM(STR(memUebergabe[1])))
         memUebergabe[2] := FieldGet(2)
         parentDlg:sleMitarbNr:setData(ALLTRIM(STR(memUebergabe[2])))
         memUebergabe[3] := FieldGet(3)
         parentDlg:sleDatum:setData(DtoC(memUebergabe[3]))
         memUebergabe[4] := FieldGet(4)
         parentDlg:sleZeit:setData(ALLTRIM(memUebergabe[4]))
         memUebergabe[5] := FieldGet(5)
         parentDlg:comboboxAktion:setData(ALLTRIM(memUebergabe[5]))
         memUebergabe[6] := FieldGet(6)
         parentDlg:sleAuftrNr:setData(ALLTRIM(STR(memUebergabe[6])))
   ELSEIF   memButton == 3
         mem := FieldGet(1)
         parentDlg:sleAuftrNr:setData(ALLTRIM(STR(memUebergabe[1])))
         mem := FieldGet(2)
         parentDlg:sleAuftrName:setData(ALLTRIM(memUebergabe[2]))
   ELSEIF   memButton == 2
         mem := FieldGet(1)
         parentDlg:sleMitarbNr:setData(ALLTRIM(STR(memUebergabe[1])))
         mem := FieldGet(2)
         parentDlg:sleMitarbNname:setData(ALLTRIM(memUebergabe[2]))
         mem := FieldGet(3)
         parentDlg:sleMitarbVname:setData(ALLTRIM(memUebergabe[3]))
/*   ELSEIF memButton == 1
         mem := FieldGet(1)
         parentDlg:sleFirmenNr:setData(ALLTRIM(STR(memUebergabe[1])))
         mem := FieldGet(2)
         parentDlg:sleFirmenName:setData(ALLTRIM(memUebergabe[2]))
*/
   ENDIF
   //Appfocus gesetzt & Fenster mit Browse geschlossen
   SetAppFocus(parentDlg:sleMitarbNname)
   oDlg_leer:destroy()
RETURN   memUebergabe
*****************************************************************************
* Soll dann zur Main übergeben werden und von dort aus per Knopfdruck geprüft werden und dann in der Datenbank geändert werden
PROCEDURE eingabePruef( mainDlg ;
                      , parentDlg ;
                      , memButton)
      LOCAL mem
   // DB-Variablen
      LOCAL memstatus
      LOCAL memoperationsart
      LOCAL memdbname
      LOCAL memkey
      LOCAL memindexnumber
      LOCAL memproto
      LOCAL memwerte
      LOCAL memReturn

   /*      pruefFirmaNr( verwaltDlg;
                  , verwaltDlg ;
                  , 2 ;
                  )
   IF    memReturn == .T.     */
      memReturn := pruefMitarbNr( mainDlg;
                   , parentDlg ;
                   , 2 ;
                   )
//   ENDIF
   IF    memReturn == .T.
      memReturn := pruefAuftrNr( mainDlg;
                  , parentDlg ;
                  , 2 ;
                  )
   ENDIF
   IF       empty( mainDlg:sleDatum:getData() )
         MsgBox( "Kein Datum eingetragen!" )
         memReturn := .F.
   ENDIF
   IF       empty( mainDlg:comboboxAktion:XbpSLE:getData() )
         MsgBox( "Keine Aktion gewählt!" )
         memReturn := .F.
   ENDIF
   IF       empty( mainDlg:sleZeit:getData() )
         MsgBox( "Keine Uhrzeit angegeben!" )
         memReturn := .F.
   ENDIF
/*
   IF       empty( mainDlg:sleAuftrNr:getData() ) .AND. memAuftragAktiv := .T.
         MsgBox( "Keine Auftragnummer angegeben!" )
         memReturn := .F.
   ENDIF
*/
   IF       memReturn == .T. .AND. memButton == 1
      //DB
         memdbname := "STEMPELN"
         memoperationsart := "STARTKEY"                             // Letzter Eintrag
         memstatus := 0
         memproto := .F.
         memwerte := {}
         memindexnumber:=1
         memkey := STR( VAL( mainDlg:sleFirmenNr:getData() ), 6, 0) ;
                   + STR( VAL( mainDlg:sleMitarbNr:getData() ), 6, 0) ;
                   + DtoS( CtoD( mainDlg:sleDatum:getData() ) )

         dbmanage ( @memstatus ;
                  , memoperationsart ;
                  , memdbname ;
                  , memkey ;
                  , memindexnumber ;
                  , memproto ;
                  , memwerte ;
                  )
   DO WHILE .NOT. STEMPELN->(Eof()) .AND. DtoC(STEMPELN->DATUM) == mainDlg:sleDatum:getData()
         *-------------------------------------------------------------------------------
         *  Überprüft AKTION des Tages
         IF ALLTRIM(STEMPELN->AKTION) == ALLTRIM( mainDlg:comboboxAktion:XbpSLE:getData() ) ;
            .AND. DtoC(STEMPELN->DATUM) == mainDlg:sleDatum:getData()
               MsgBox( "Diese AKTION wurde an diesem Tag schon gestempelt!" )
               mem := .F.
               EXIT
         ELSE
               MsgBox( "Wrong" )

               memdbname := "STEMPELN"
               memoperationsart := "SKIP"                         // Letzter Eintrag
               memstatus := 0
               memproto := .F.
               memwerte := {}
               memindexnumber:=1
               memkey := ""

               dbmanage ( @memstatus ;
                        , memoperationsart ;
                        , memdbname ;
                        , memkey ;
                        , memindexnumber ;
                        , memproto ;
                        , memwerte ;
                        )
               mem := .T.
         ENDIF

   ENDDO
         IF mem == .T.
               anlegenDbEintrag( mainDlg )
         ELSE
         ENDIF
   ENDIF
   IF       memReturn == .T. .AND. memButton == 2
      //DB
         memdbname := "STEMPELN"
         memoperationsart := "STARTKEY"                             // Letzter Eintrag
         memstatus := 0
         memproto := .F.
         memwerte := {}
         memindexnumber:=1
         memkey := STR( VAL( mainDlg:sleFirmenNr:getData() ), 6, 0) ;
                   + STR( VAL( mainDlg:sleMitarbNr:getData() ), 6, 0) ;
                   + DtoS( CtoD( mainDlg:sleDatum:getData() ) )

         dbmanage ( @memstatus ;
                  , memoperationsart ;
                  , memdbname ;
                  , memkey ;
                  , memindexnumber ;
                  , memproto ;
                  , memwerte ;
                  )
   DO WHILE .NOT. STEMPELN->(Eof()) .AND. DtoC(STEMPELN->DATUM) == mainDlg:sleDatum:getData()
         *-------------------------------------------------------------------------------
         *  Überprüft AKTION des Tages
         IF ALLTRIM(STEMPELN->AKTION) == ALLTRIM( mainDlg:comboboxAktion:XbpSLE:getData() ) ;
            .AND. DtoC(STEMPELN->DATUM) == mainDlg:sleDatum:getData()
               MsgBox( "Wrong" )

               memdbname := "STEMPELN"
               memoperationsart := "SKIP"                         // Letzter Eintrag
               memstatus := 0
               memproto := .F.
               memwerte := {}
               memindexnumber:=1
               memkey := ""

               dbmanage ( @memstatus ;
                        , memoperationsart ;
                        , memdbname ;
                        , memkey ;
                        , memindexnumber ;
                        , memproto ;
                        , memwerte ;
                        )
               mem := 1
         ELSE
               mem := 2
               EXIT
         ENDIF

   ENDDO
         IF mem == 2
               aendernDbEintrag( mainDlg )
         ELSE
         ENDIF
   ENDIF
RETURN
***********************************************************
* Hier soll die Datenbank dann  geändert werden
PROCEDURE aendernDbEintrag( mainDlg )
   // DB-Variablen
      LOCAL memstatus
      LOCAL memoperationsart
      LOCAL memdbname
      LOCAL memkey
      LOCAL memindexnumber
      LOCAL memproto
      LOCAL memwerte
   //DB-Zugriff definieren
      memdbname := "STEMPELN"
      memoperationsart := "UPDATE"
      memstatus := 0
      memproto := .F.
      memwerte := {}
      memindexnumber := 1
      memkey := STR( VAL( memUebergabe[1] ), 6, 0) ;
                   + STR( VAL( memUebergabe[2] ), 6, 0) ;
                   + DtoS( CtoD( memUebergabe[3] ) ) ;
                   + memUebergabe[4]                  // Benutzter Index
      AADD(memwerte,{"AKTION", mainDlg:comboboxAktion:XbpSLE:getData() } )
      AADD(memwerte,{"ZEIT", mainDlg:sleZeit:getData() } )
      AADD(memwerte,{"AUFTRNR", VAL( mainDlg:sleAuftrNr:getData() ) } )

      dbmanage ( @memstatus ;
               , memoperationsart ;
               , memdbname ;
               , memkey ;
               , memindexnumber ;
               , memproto ;
               , memwerte ;
               )
RETURN
Sorry, bin nicht so nicht so gut im erklären :(
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array von Funktion übergeben und weiterleiten

Beitrag von brandelh »

Wollte dies so gestalten, dass ich die Datei mit kleinem Aufwand in jedem Programm das ein Browse braucht einbinden kann.
dein code nutzt FieldGet(x), das ist zwar unabhängig von dem jeweiligen Feldnamen, aber die fest vergebene Feldnummer und kein ALIAS / SELECT -> Verweis,
zwingt dich in die aktuell geöffnete Datei, deren Feldstruktur immer gleich sein muss. Ob das so flexibel ist ?
So, nun zum Problem:
Bei einer Funktion, die die Auswahl in SLEs einträgt, müsste ich ein Array in meine Main übergeben.
Dieses Array benötige ich damit ein Eintrag in einer Datenbank geändert werden kann.
Ich vermute das ist die Funktion:

Code: Alles auswählen

FUNCTION browseZuSle( parentDlg, oDlg_leer, oBrowse, memButton )
   LOCAL memUebergabe[6]     //Merkvariabel *** das ist ein Array mit 6 Elementen, wobei jedes davon am Anfang NIL enthält !!! 
   ...
RETURN   memUebergabe
diese Funktion erstellt das Array memUebergabe mit [6] Elementen, diese werden je nach Button mit den Feldinhalten gefüllt und genau diese werden am Ende zurückgegeben ...
Angenommen das die Funktion so aufgerufen wird, macht sie genau das was oben gefragt wurde (Werte im Array zurückgeben !)

Code: Alles auswählen

aBack := browseZuSle( oDlg, oDlg_leer, oBrowse, memButton )
aBack[1] = NIL oder FieldGet(1)
aBack[2] = NIL oder FieldGet(2)
aBack[3] = NIL oder FieldGet(3)
...
insoweit geschieht genau das was du nachgefragt hast (Rückgabe von Werten im Array), aber sicher nicht das was du wolltest:
Die Werte in den SLEs werden ja geändert.
Du setzt die SLE mit setData(), die Änderungen muss man aber mit getData() abholen.
Das EditFenster des Datensatzes wird über eine Funktion wie die oben geladen, aber das Abholen der Änderungen muss man erledigen, nachdem der Anwender chancen hatte etwas einzugeben.
Z.B. mit dem OK Button der das Editfenster schließt, oder einem eigenen "Änderungen speichern" etc.

Ich rate dringend das Speichern von der Anzeige zu trennen, dann hat man es später leichter die Datenbasis zu ändern.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array von Funktion übergeben und weiterleiten

Beitrag von brandelh »

OK, die zweite Funktion hatte ich wohl überlesen ... da stehten GetData() ...

Code: Alles auswählen

* Soll dann zur Main übergeben werden und von dort aus per Knopfdruck geprüft werden und dann in der Datenbank geändert werden
PROCEDURE eingabePruef( mainDlg, parentDlg, memButton)
   LOCAL memwerte  // eine normale Variable
   ...
   memwerte := {}  // wird zu einem leeren Array ...
   ...
   dbmanage ( @memstatus, memoperationsart, memdbname, memkey, memindexnumber, memproto, memwerte)  // leeres Array wird übergeben
RETURN
diese Funktion übergibt nur ein leeres Array ... ???

Code: Alles auswählen

***********************************************************
* Hier soll die Datenbank dann  geändert werden
PROCEDURE aendernDbEintrag( mainDlg )
   LOCAL memwerte
   ...
   memwerte := {}
   AADD(memwerte,{"AKTION", mainDlg:comboboxAktion:XbpSLE:getData() } )
   AADD(memwerte,{"ZEIT", mainDlg:sleZeit:getData() } )
   AADD(memwerte,{"AUFTRNR", VAL( mainDlg:sleAuftrNr:getData() ) } )
   ... 
   dbmanage ( @memstatus, memoperationsart, memdbname, memkey, memindexnumber, memproto, memwerte )
RETURN
hier werden nun also die Änderungen im Array übergeben, wo ist also das Problem ?

Vielleicht im viel zu komplizierten Aufbau ?
Gruß
Hubert
Quakobert
Rookie
Rookie
Beiträge: 5
Registriert: Do, 02. Apr 2015 15:41

Re: Array von Funktion übergeben und weiterleiten

Beitrag von Quakobert »

Naja, was heißt leer ? Habe das Array mit Msgbox, in der Prozedur in der diese erstellt wird, ausgelesen -> hat funktioniert.
Jedoch später nach der Übergabe nicht mehr.
Kann natürlich sein, dass das Array nicht leer ist und ich irgendetwas falsch mache :(

Ich kann jedoch nicht sagen, ob mein Aufbau kompliziert ist. Habe gedacht dass dieser so doch recht einfach ist.
Muss mir das ganze wohl noch genauer anschauen.

Mit freundlichen Grüßen
Quakobert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array von Funktion übergeben und weiterleiten

Beitrag von brandelh »

Das in eingabePruef()m ?
nach deinem Code oben muss das doch leer sein, oder wo wird dem da was übergeben ?

Das in aendernDbEintrag( mainDlg ) ist nicht leer, und sollte in dbmanage() auch einen Inhalt haben !

Bei einer übergebenen Variable wird ja normalerweise nur der Inhalt übergeben, solange kein @ davor steht. Mit @ die Referenz, sodass Änderungen auch in der aufrufenden Funktion ankommen.
Bei Arrays ist das auch so, aber da die Arrayvariable selbst nur einen Verweis auf die Inhalte enthält und die interne Kopie der Variablen auf die gleichen Inhalte zeigt müssten auch Änderungen in dbmanage() in der aufrufenden Funktion ankommen.

PS: die Codeschriften hier sind recht klein und wenn die Listings länger werden überliest man (ich) schnell was ;-)
Gruß
Hubert
Quakobert
Rookie
Rookie
Beiträge: 5
Registriert: Do, 02. Apr 2015 15:41

Re: Array von Funktion übergeben und weiterleiten

Beitrag von Quakobert »

Wir sind alle nur Menschen :D ,
Habe mich nun dazu entschieden eine ID- Nummer( für jede neue Zeile ein eindeutige Zahl) zu vergeben. Damit spar ich mir das ganze hin und her.
Mein Problem war glaube ich nicht die Übergabe sondern die Annahme des Arrays.

Ich danke dennoch für die Hilfe und die Zeit die mir geopfert wurde. "Hmm, komisch das es keinen Verneigen-Smilie gibt."

PS: Vielleicht könnte man noch ein Beispiel angeben wie ein Array angenommen wird. Damit dieser Thread geschlossen werden kann.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array von Funktion übergeben und weiterleiten

Beitrag von brandelh »

:?: :?: :?:

wie jede andere variable auch ...

Code: Alles auswählen

local aWert := {"A1","B2","C3"}
ZeigWert(aWert, 2) // => "B2"
? aWert[1] // => "NEU"

function ZeitWert(aW,nI)
    ? aW[nI]
   // aber die WERTE sind Referenzen ...
    aW[1] := "NEU"
   // Vorsicht bei ...
*   aW := { "Neues Array" } // was passiert mit dieser Zeile ohne * ? ;-) 
return 
PS: ich hoffe ich habe mich jetzt nicht vertippt ... Beispiel nicht kompiliert ;-)

Problematisch ist nur das Mischen von PRIVAT ODER STATIC Variablen mit LOCAL, da dann die local eine andere aus einer Funktion "ausblendet" ...

PS: Eindeutige IDs sind auf jeden Fall eine gute Idee ;-)
Gruß
Hubert
Quakobert
Rookie
Rookie
Beiträge: 5
Registriert: Do, 02. Apr 2015 15:41

Re: Array von Funktion übergeben und weiterleiten

Beitrag von Quakobert »

Vielen Dank.
Ich glaube bei eindeutigen IDs kommen auch weniger Fehler zustande :D
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Array von Funktion übergeben und weiterleiten

Beitrag von AUGE_OHR »

Quakobert hat geschrieben:Ich kann jedoch nicht sagen, ob mein Aufbau kompliziert ist. Habe gedacht dass dieser so doch recht einfach ist.
wenn du die Möglichkeiten von OOP und Class Code nutzen würdest dann sähe dein Code vielleicht "verständlicher" aus ;)
Quakobert hat geschrieben:Kann natürlich sein, dass das Array nicht leer ist und ich irgendetwas falsch mache
das "Problem" bei Function und Parameter / Übergabe ... es werden immer "mehr" und man kann sich leicht mit einem "," (Komma) verzählen ...

Frage : arbeitest du mit dem Debugger ?

klar kann man eine MsgBox() nehmen oder mit

Code: Alles auswählen

SET ALTER TO MyDebug.TXT
Ausgaben in ein Logfile umleiten aber oft "sieht" man das Problem erst wenn man Schrittweise durch die betreffenden Programmstellen geht.
gruss by OHR
Jimmy
Antworten