Seite 1 von 1

Sammlung von Anfängerfragen mit Antworten

Verfasst: Do, 06. Aug 2015 14:36
von brandelh
*** Was ist ein Array ***

zunächst ein Datentyp von Xbase++ der es erlaubt mehrere Werte in einer "Liste" zu speichern.
Wenn man sich eine Variable wie eine Schuhschachtel vorstellt, dann ist ein Array eine Folge von Schuhschachteln.
Wenn dann darin jeweils nur ein Wert steht ist das ein eindimensionales Array ...

Code: Alles auswählen

aEindimensional := { 1, 2, 3, 4, 5 } // mit 5 Werten
? "Zweites Element",aEindimensional[2]
jedes dieser "Schuhschachteln, kann in Xbase++ aber auch einen Verweis auf eine andere "Liste von Schuhschachteln" enthalten.
Ein zweidimensionales Array ist wie eine DBF Datei im Arbeitspeicher, wobei es keine Feldnamen gibt, sondern nur Indizes !

aAdressen := { {"Name 1", "PLZ 1", ... , nAlter1 }, {"Name 2", "PLZ 2", ... , nAlter2 } }

wie man sieht ist es in Xbase++ erlaubt verschiedene Typen zu mischen !
Name von Adresse 2 gefällig ?

aAdressen[2,1] // erste Ebene / Dimension zuerst auswählen, WELCHE Adresse will ich ... dann welche Info in der Adresse
aAdressen[2] [1] // andere Schreibweise, gleiches Ergebnis

In Xbase sind sehr große Arrays möglich, aber nichts ist endlos !

Re: Sammlung von Anfängerfragen mit Antworten

Verfasst: Do, 06. Aug 2015 14:45
von Manfred
Hubert,

sollte sowas nicht in unsere Wiki?

*** wie bekommt man eine DBF in ein Array ***

Verfasst: Do, 06. Aug 2015 14:47
von brandelh
*** wie bekommt man eine DBF in ein Array ***

das mache ich gerne für Hilfslisten, die man ab und an braucht.
Sie sind nicht wirklich lang aber DBF öffnen und schließen kostet Zeit und viele offene Dateien belasten die Server.

es gibt verschiedene Vorgehensweisen, je nach Geschmack, das wäre Clipper Style:

Code: Alles auswählen

use ... 
dbgotop()
aData := {} // leeres Array anlegen
do while ! eof()
   // entweder: einige Felder merken
   aadd(aData, { Feld1, Feld4, Feld8 } )
   // oder:       alle Felder einlesen, da kann man in Xbase++ eine Funktion nutzen, die einen Datensatz als Array zurückgibt
   aadd(aData, scatter() )   // in blocks.prg im System Source Verzeichnis
   // eventuell mit IF Abfrage einschränken ???
   dbskip() 
enddo
mit Xbase++ Style geht es schneller, aber man vielleicht abstrakter:

Code: Alles auswählen

use ... 
dbgotop() // hier nicht nötig
aData := {} // leeres Array anlegen
dbeval( {|| aadd(aData, { Feld1, Feld4, Feld8 } ) } ) // Feldauswahl 
dbeval( {|| aadd(aData, scatter() )             }) // oder alle Felder

do while ! eof()
   // entweder: einige Felder merken
   aadd( )
   // oder:       alle Felder einlesen, da kann man in Xbase++ eine Funktion nutzen, die einen Datensatz als Array zurückgibt
   aadd( )   // in blocks.prg im System Source Verzeichnis
   // eventuell mit IF Abfrage einschränken ???
   dbskip() 
enddo

Re: Sammlung von Anfängerfragen mit Antworten

Verfasst: Do, 06. Aug 2015 14:49
von brandelh
Manfred hat geschrieben:Hubert,
sollte sowas nicht in unsere Wiki?
im Prinzip ja, aber ich beantworte hier Anfragen die ich per PN bekommen habe, was ich nicht mag !
Gerne darf man das was nützlich ist umkopieren, jetzt habe ich aber keine Zeit dazu ...

*** wann lagere ich eine DBF in ein Array um ??? ***

Verfasst: Do, 06. Aug 2015 15:00
von brandelh
nur wenn es Sinn macht !

Es macht Sinn, wenn ich z.B. eine Listboxauswahl in der DBF habe und diese nicht nur einmalig aufgebaut wird.
Eine Funktion mit static var kann die Datein einmal einlesen und danach als Array aus der Static zurückliefern.
Das spart Zeit, besonders auf lahmen Speichermedien.

Wenn ich die Daten als Parameter übergeben muss, ist ein Array auch einfacher, aber das Einlesen und nachträglich durchlaufen dauert länger als gleich die DBF zu nutzen ...

Beispiel eMail-Versand von "Meldungen" warum auch immer ...

Code: Alles auswählen

use Adressen
dbGoTop()
do while ! eof()
   if Filterbedingung()  // was auch immer 
      // Variablen füllen
     cEmpfänger := field->eMailAdr
      if SendeEmailAn( cEmpfänger, cCopy, cBCC, cInhalt, aAnhänge ) // Senden von Massenmail geht am Besten mit SMTP Server (dazu gibt es Beispiele)
         replace SendDat with date()
         replace SendOK with "OK"
      else
         replace SendOK with "ERR"
      endif
   endif
   dbskip()
enddo
in diesem Fall würde ich weder in Array auslagern, noch dbEval() benutzen, denn so ist man viel flexibler ...

Re: Sammlung von Anfängerfragen mit Antworten

Verfasst: Do, 06. Aug 2015 15:38
von Koverhage
aber ich beantworte hier Anfragen die ich per PN bekommen habe, was ich nicht mag !
Da würde ich gar nicht reagieren., bzw. nur einmalig um zu schreiben das diese Fragen im Forum gestellt werden.
Es ist eigentlich unverschämt allgemeine Fragen per PN zu stellen (meine Meinung).

Re: Sammlung von Anfängerfragen mit Antworten

Verfasst: Do, 06. Aug 2015 15:57
von Jan
Ich habe auch schon Anfragen per PN bekommen. Und bitte dann grundsätzlich darum, die Fragen bitte öffentlich zu stellen. Mit der Begründung das es niemandem hilft, wenn sein Problem hinter verschlossenen Türen besprochen wird, und sonst niemand etwas davon hat.

Was das noch toppt sind PN an mehrere Personen im Verteiler. Woher soll man wissen, ob nicht jemand schon die Frage beantwortet hat? Da machen sich also gleich mehrere Personen Gedanken, obwohl jemand anderes die Lösung vielleicht schon gefunden hat.

Einer der Betreffenden meinte auf meinen Hinweis (zwei mal, weil er das trotzdem nicht sein ließ), das ihm das Posten in der Öffentlichkeit nicht behagen würde (frei wiedergegeben aus der Erinnerung).

Ich stimme Klaus absolut zu: Keine Fragen beantworten, die per PN kommen. Immer auf das Forum verweisen.

Jan