Zugriff auf Datenbankfelder (im Netz)

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Zugriff auf Datenbankfelder (im Netz)

Beitrag von satmax »

Ich habe das bisher immer so gehandhabt:

...
Datensatz anfahren
Alle Felder in Varibalen eingelesen (Im Prinzip in eine Struktur zB. "sDaten"), eine Kopie dieser Struktur angelegt " sDatenBak
// DATENBANK einlesen
sDaten:name:=STAMMDATEN->NAME
...

Felder zum editieren anzeigen lassen (eventuell vorm Editieren nochmals neu einlesen)
sDaten:name
sDaten:vorname
...
Beim Speichern geprüft on sich etwas geändert hat sDaten <> SDatenBak
Wenn Ja
RECORD LOCK
REPLACE STAMMDATEN->NAME WITH sDaten:name
RECORD UNLOCK
...

So brauche ich den Record nur kurz gelockt zu halten. Wenn ich eine Eingabemaske zur Bearbeitung sperren wollte, habe ich mit einem File Semaphore gearbeitet.

Die Strukture habe ich mit

define structure sDate as ....

angelegt (von Huggle& Partner da wird dann _StructDef aufgerufen).

Ich könnte das jetzt mit einem Array nachbilden. Zuvor wollte ich fragen wie Ihr das macht, eventuell gibt es da unter Xbase (eXPress) andere Lösungsansätze.


Gruß
Markus
Gruß
Markus
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von UliTs »

satmax hat geschrieben:..Ich könnte das jetzt mit einem Array nachbilden. Zuvor wollte ich fragen wie Ihr das macht, eventuell gibt es da unter Xbase (eXPress) andere Lösungsansätze.
Hallo Markus,

in Kürze (????? :lol: :? :shock: :o :) :D ) soll xBase++ 2.0 rauskommen. Das beinhaltet DataObjects. Und damit kann man so etwas super machen.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
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: Zugriff auf Datenbankfelder (im Netz)

Beitrag von brandelh »

Array geht auch ganz gut, weil scatter() ein Array aus dem aktuellen Datensatz erzeugt.
mit ACLONE() oder 2 Aufrufen hättest du eine Kopie und ein Original zum Ändern.

Arrays sind deshalb gut weil man mit AEVAL() oder Schleifen arbeiten kann ... auf Felder greift man dann mit FieldPut(x,uWert) bzw. FieldGet() zu.

Man könnte aktuell auch eine allgemeine Klasse erstellen und per Feldname darauf zugreifen. Alle nicht definierten Variablen/Methoden landen dann in

Code: Alles auswählen

Abstract()  - Abstrakte Klasse mit einer einheitlichen Schnittstelle für andere Klassen
:noMethod()- Verarbeitet Aufrufe von definierten Methoden 
:setNoIVar( <cMessage>, <xValue> ) 
:getNoIVar( <cMessage> ) --> xReturn 
allerdings sind auf diese Weise angelegte Felder ziemlich langsam, erst Xbase++ 2.0 wird das einfacher und schneller machen => die erwähnten Datenobjekte.
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von satmax »

Danke für die Hinweise, warten geht leider nicht... :(

AClone() kenne ich Scatter() nicht wirklich. Wo finde ich diese Function? In meiner Doku ist da nichts.

Wie macht Ihr das mit der Doku? Früher mit ng war das super, alle Hersteller konnten dieses Format. Kopiert Ihr die winhelpfiles der verschiedenen Hersteller in einen gemeinsamen Ordner? Oder gibts da eine Online-Wiki? ;)
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
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: Zugriff auf Datenbankfelder (im Netz)

Beitrag von brandelh »

In einem Verzeichnis auf dem Desktop habe ich LINKS zu den Hilfedateien für Xbase++ plus Zusatztools.

Scatter() ist nicht dokumentiert, aber verfügbar.
Gather() ist das Gegenteil, aber mit dem stehe ich auf dem Kriegsfuß ;-)
Gruß
Hubert
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2935
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von Wolfgang Ciriack »

Mit Express++ geht das z.B. so (ähnlich wie mit DataObjects bei 2.0):

Code: Alles auswählen

** Datensatzobject anlegen
oKuRec:=ku->(DC_DbRecord():new()) 
** Daten einlesen
ku->(DC_DbScatter(oKuRec))
** Daten manipulieren, (Namen wie in DBF)
oKuRec:Kundennr:="12345"
** Daten zurück in Datenbank
ku->(DC_DbGather(oKuRec) (evtl. mit 2. Parameter .T., dann wird ein neuer Datensatz angelegt)
Weiterhin gibt es noch viele Funktionen, die mit diesen Objecten umgehen können (duplizieren, loggen von Gatherbefehlen etc.)
Viele Grüße
Wolfgang
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von georg »

Hallo,


da im Titel steht "im Netz" - also brauchst Du ZWEI Strukturen, eine nimmt das Abbild beim Einlesen auf und wird nicht verändert, mit der zweiten wird gearbeitet. Nach dem LOCK RECORD wird die erste Struktur gegen den Datensatz geprüft, ob sich zwischenzeitlich durch Dritte Änderungen ergeben haben. Und erst, wenn feststeht, dass es keine Änderungen gegeben hat, schreibst Du die Daten zurück.

Wurden Daten geändert (konkurrierendes Update), musst Du von Fall zu Fall entscheiden, was getan werden soll.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von satmax »

georg hat geschrieben:Hallo,


da im Titel steht "im Netz" - also brauchst Du ZWEI Strukturen, eine nimmt das Abbild beim Einlesen auf und wird nicht verändert, mit der zweiten wird gearbeitet. Nach dem LOCK RECORD wird die erste Struktur gegen den Datensatz geprüft, ob sich zwischenzeitlich durch Dritte Änderungen ergeben haben. Und erst, wenn feststeht, dass es keine Änderungen gegeben hat, schreibst Du die Daten zurück.

Wurden Daten geändert (konkurrierendes Update), musst Du von Fall zu Fall entscheiden, was getan werden soll.
Ich habe zwei Strukturen.
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von georg »

:tool:

Das hatte ich aber auch gehofft.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12908
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von AUGE_OHR »

satmax hat geschrieben:Ich habe das bisher immer so gehandhabt:
...
Datensatz anfahren
Alle Felder in Varibalen eingelesen (Im Prinzip in eine Struktur zB. "sDaten"), eine Kopie dieser Struktur angelegt "
...
Beim Speichern geprüft on sich etwas geändert hat sDaten <> SDatenBak
auch bei GET hast du unter Cl*pper schon ein Object gehabt.
Es gibt die Property ( Eigenschaft ) o:original und o:changed die man dazu gebrauchen kann.

unter Cl*pper ist die GetList ja bekannt. Wenn du dir Class Code vom Formdesigner ansiehst hast du für jedes Feld eine Class Var pro SLE

Code: Alles auswählen

VAR editControls
...
   ::Bestand   := XbpSLE():new( ::drawingArea ... )
...
   AAdd( ::editControls, ::Bestand )
wie in der Getlist hast du nun in ::editControls alle Objecte in einem Array.

wenn du Feld Inhalte anzeigen (SAY) willst musst du die aus der DBF holen mit

Code: Alles auswählen

   * Werte in Editcontrols übertragen
   AEval ( ::EditControls, { | oXbp | oXbp:SetData() } )
und damit die SLE "füllen"

ein Pushbutton zum navigieren könnte so aussehen

Code: Alles auswählen

oXbp:activate := {|| Gather( aEditControls ) ,;
                     CUSTOMER->(DbSkip(-1)) ,;
                     Scatter ( aEditControls ) }
bei XbpSLE hast du nun den o:editBuffer() und die Property o:changed und mit o:Getdata() wird ein SLE "gelesen".
gruss by OHR
Jimmy
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von satmax »

Hallo Jimmy,

Danke für Deine Ausführungen. Wenn ich jetzt eine Objekt GetList habe, wie kann ich da auf ein bestimmtes GetObjekt zugreifen, Beispiel:

Code: Alles auswählen

  oRecord := STAMMDAT->(DC_DbRecord():new())
  STAMMDAT->(DC_DbScatter(oRecord))

  // GUI ON  // turn on GUI mode
  GetList := {}
  @ 4,1 DCSAY 'Kundennummer'    GET oRecord:kdnr
  @ 6,1 DCSAY 'Anrede      '    GET oRecord:anrede
  @ 7,1 DCSAY 'Name        '    GET oRecord:name GETSIZE 30
...
  @ 30, nSpalte+=8             DCPUSHBUTTON CAPTION "~Löschen" SIZE 8,            1 ACTION {||delRecord(oRecord,GetList)}
...
  DCREAD GUI
...

static function delRecord(oRecord,GetList)
// Hier möchte ich über das Objekt GetList  auf das GetObjekt  oRecord:name zugreifen
// Laienhaft GetList oRecord:name:readvar()
Das ist zwar jetzt in eXpress geschrieben, der Zugriff auf oGet via oGetList sollte aber gleich bleiben.

Gruß
Markus
Gruß
Markus
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von Rolf Ramacher »

Hallo Markus,

ich mache das fast ausschließlich mit Arrays. Es sind mehrdimensionale Array die beinhalten, den Inhalt des Feldes, die datenbank, den feldnamen, satznummer

beim speichern. wird das array durchlaufen, db öffnen - dbgoto fieldput - db schliessen

ca 4. Zeiler
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2935
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von Wolfgang Ciriack »

Hallo Markus,
was willst du denn Löschen ? Den Satz in der DBF ?
Viele Grüße
Wolfgang
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von satmax »

Hallo Wolfgang,

nein, das ist nur ein Beispiel. Es geht mir um den Zugriff auf ein oGet aus einem aGetList. Oder anders gesagt, wie greife ich in einer Subroutine einfach auf ein oder mehrere oGet Objekte aus meiner aktuellen GetList zu.

Ich stehe vor der Entscheidungsfindung:

a) Mache ich die Umsetzung mit xBase(zu 90% ja)
b) Welche Tools verwende ich (eXpess oder TopDown)

In eXpress habe ich schon einiges angetestet , in TopDown habe ich diese Möglichkeit leider nicht.

Vom Demo gefällt mir TD mehr. Nur dem Desinger traue ich nicht so ganz. Ich denke es ist effizienter die Masken mit @ Zeile, Spalte zu erstellen.

Leider Habe ich von dem TD Demo keinen Sourcecode und kann mir dadurch kein Bild darüber machen.
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von satmax »

Rolf Ramacher hat geschrieben:Hallo Markus,

ich mache das fast ausschließlich mit Arrays. Es sind mehrdimensionale Array die beinhalten, den Inhalt des Feldes, die datenbank, den feldnamen, satznummer

beim speichern. wird das array durchlaufen, db öffnen - dbgoto fieldput - db schliessen

ca 4. Zeiler
scatter() und gather() leisten da gute dienste, so viel habe ich unter anderem schon gelernt hier bei Euch. :D

Gruß
Markus
Zuletzt geändert von satmax am So, 22. Sep 2013 18:59, insgesamt 1-mal geändert.
Gruß
Markus
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2935
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von Wolfgang Ciriack »

nein, das ist nur ein Beispiel. Es geht mir um den Zugriff auf ein oGet aus einem aGetList. Oder anders gesagt, wie greife ich in einer Subroutine einfach auf ein oder mehrere oGet Objekte aus meiner aktuellen GetList zu.
Also es gibt da schon Möglichkeiten über DC_GetListObject usw. aber alle Werte des Datensatzes hast du doch schon in deinem oRecord-Object, d.h. z.B. über oRecord:kundennr oder oRecord:kundname kannst du auf die Werte zugreifen.
Oder was möchtest du in deiner Subroutine an den Gets ändern ?
Viele Grüße
Wolfgang
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von satmax »

Wolfgang Ciriack hat geschrieben:
nein, das ist nur ein Beispiel. Es geht mir um den Zugriff auf ein oGet aus einem aGetList. Oder anders gesagt, wie greife ich in einer Subroutine einfach auf ein oder mehrere oGet Objekte aus meiner aktuellen GetList zu.
Also es gibt da schon Möglichkeiten über DC_GetListObject usw. aber alle Werte des Datensatzes hast du doch schon in deinem oRecord-Object, d.h. z.B. über oRecord:kundennr oder oRecord:kundname kannst du auf die Werte zugreifen.
Oder was möchtest du in deiner Subroutine an den Gets ändern ?
Danke Wolfgang, oRecord passt genau. Ich dachte immer die Änderungen in einem Get Feld werden erst nach dem read nach oRecord übertragen. Die Daten stehen aber unmittelbar nach dem editieren schon zur Verfügung. Das werden einige harte Wochen bis ich da wieder reinkommen...

Unter clipper habe ich auch teilweise mit Fenster gearbeitet, der Kunde konnte so während der Auftragsbearbeitung alle Stammdaten änderen und neu anlegen, oder auch von jeder beliebigen Programmstelle per Hotkey auf verschiedene Stammdaten zugreifen und ändern. Dazu habe ich am Programmstart alle DBs geöffnet und im Programm dann jeweils mit
// Workarea sichern
nRecNo:=RecNo()
nOldSelect:= SELECT(Stammdaten)

Subroutinen ausgeführt
....

// am ende wieder
// Workarea wiederherstellen
SELECT(nOldSelect)
Goto nRecNo

(so aus dem Kopf raus)

Wäre es unter Windows nicht besser und einfacher, in jedem Dialog einfach die entsprechenden Datenbanken neu zu öffnene und beim Verlassen wieder zu schließen? So habe ich kein Problem mit mehren Instanzen, jede hat ja dann Ihr eigenes DB Objekt. Zumindest für die meisten Fälle.

Ausserdem überlege ich, ein Datenbankfeld "TIMESTAMP" in jeden Record einzufügen. In "TIMESTAMP" steht immer Datum+Uhrzeit der letzten Datensatzänderung, so kann man leicht überprüfen ob sich seit dem letzten read der Datensatz geändert hat. Eventuell auch gleich noch das Feld des aktuellen Benutzers dazu und ich weiß wer wann den Datensatz zuletzt geändert hat.

Gruß
Markus
Gruß
Markus
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2935
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von Wolfgang Ciriack »

Da solltest du überlegen, ob du nicht die einzelnen Programmteile in verschiedenen Threads laufen läßt, diese sind unabhängig voneinander, und in jedem Thread die Datenbanken, die du benötigst, öffnest.

Zum vergleichen von Record-Objecten bietet sich dann auch DC_DbRecordCompare() an (Original mit Eingelesenem vergleichen). Auch gibt es noch mehrere nützliche Funktionen, schau mal in der Hilfe bei DC_Db...
Viele Grüße
Wolfgang
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Zugriff auf Datenbankfelder (im Netz)

Beitrag von satmax »

Das mit den Threads möchte ich im Moment noch lassen, das wird mir zu viel für den ersten Einstieg, aber danke für den Hinweis. Ich möchte mal die Stammdaten fertig machen und dann weiter überlegen. Im Hauptprogramm gibt es 2 Teile da könnte das mit den Threads durchaus Sinn machen.

Beste Grüße
Markus
Gruß
Markus
Antworten