Array von Funktion übergeben und weiterleiten
Moderator: Moderatoren
Array von Funktion übergeben und weiterleiten
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.
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.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Array von Funktion übergeben und weiterleiten
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.
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.
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
Ich persönlich bevorzuge CLASS Code mit eigenem Quellcode für jedes Fenster.
Gruß
Hubert
Hubert
Re: Array von Funktion übergeben und weiterleiten
Ok, es wird ein Programm um eine Datenbank zu verwalten. In diesem Fall möchte ich diese ändern.
Hier der Quellcode:
Sorry, bin nicht so nicht so gut im erklären
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
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Array von Funktion übergeben und weiterleiten
dein code nutzt FieldGet(x), das ist zwar unabhängig von dem jeweiligen Feldnamen, aber die fest vergebene Feldnummer und kein ALIAS / SELECT -> Verweis,Wollte dies so gestalten, dass ich die Datei mit kleinem Aufwand in jedem Programm das ein Browse braucht einbinden kann.
zwingt dich in die aktuell geöffnete Datei, deren Feldstruktur immer gleich sein muss. Ob das so flexibel ist ?
Ich vermute das ist die Funktion: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.
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
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)
...
Du setzt die SLE mit setData(), die Änderungen muss man aber mit getData() abholen.Die Werte in den SLEs werden ja geändert.
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
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Array von Funktion übergeben und weiterleiten
OK, die zweite Funktion hatte ich wohl überlesen ... da stehten GetData() ...
diese Funktion übergibt nur ein leeres Array ... ???
hier werden nun also die Änderungen im Array übergeben, wo ist also das Problem ?
Vielleicht im viel zu komplizierten Aufbau ?
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
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
Vielleicht im viel zu komplizierten Aufbau ?
Gruß
Hubert
Hubert
Re: Array von Funktion übergeben und weiterleiten
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Array von Funktion übergeben und weiterleiten
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
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
Hubert
Re: Array von Funktion übergeben und weiterleiten
Wir sind alle nur Menschen ,
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.
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.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Array von Funktion übergeben und weiterleiten
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
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
Hubert
Re: Array von Funktion übergeben und weiterleiten
Vielen Dank.
Ich glaube bei eindeutigen IDs kommen auch weniger Fehler zustande
Ich glaube bei eindeutigen IDs kommen auch weniger Fehler zustande
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Array von Funktion übergeben und weiterleiten
wenn du die Möglichkeiten von OOP und Class Code nutzen würdest dann sähe dein Code vielleicht "verständlicher" ausQuakobert hat geschrieben:Ich kann jedoch nicht sagen, ob mein Aufbau kompliziert ist. Habe gedacht dass dieser so doch recht einfach ist.
das "Problem" bei Function und Parameter / Übergabe ... es werden immer "mehr" und man kann sich leicht mit einem "," (Komma) verzählen ...Quakobert hat geschrieben:Kann natürlich sein, dass das Array nicht leer ist und ich irgendetwas falsch mache
Frage : arbeitest du mit dem Debugger ?
klar kann man eine MsgBox() nehmen oder mit
Code: Alles auswählen
SET ALTER TO MyDebug.TXT
gruss by OHR
Jimmy
Jimmy