PostgreSQL "Feld" Namen -> Codeblock ? [erledigt]

Hier dreht es sich um den PostGre Server

Moderator: Moderatoren

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

PostgreSQL "Feld" Namen -> Codeblock ? [erledigt]

Beitrag von AUGE_OHR »

hi,

ich komme an die PostgreSQL MDIDEMO "Table" mit Phil Ide´s "Wrapper" wie folgt

Code: Alles auswählen

   cConnect := "host=localhost dbname="+cDbName+" user="+cUser+" password="+cPwd
   oPG := PGSql():new()
   if oPG:connect( cConnect )
ich kann mir nun die "Feld"-Namen" ausgeben lassen

Code: Alles auswählen

      cSQL := "SELECT * FROM %1"
      cSQL := StrTran(cSQL,"%1",Lower(cTable))
      if oPG:exec(cSQL)
         oRes := oPG:result
         aFNames := oRes:getFieldnames()
         nCols := LEN(aFNames)
ich komme auch an die "Feld"-Inhalte

Code: Alles auswählen

         oRes:goTop() // go top!
         //
         nRow := 0
         nH := FCreate('result2.txt')
         while !oRes:eof()
            n := 1
            cLine := ""
            for n := 1 to nCols
              cLine += iif( n > 1 , ", " , "")
              cLine += oRes:getValue( nRow, n )
            next
            cLine += CRLF
            FWrite( nH, cLine )
            oRes:skip()
            nRow++
         enddo
         FClose(nH)
so und wie mache ich daraus nun einen Codeblock für eine XbpColumn() ?

klar könnte man alles in ein Array "schreiben" und das browsen ...

mein "Problem" :

Code: Alles auswählen

   for i := 1 to oPGResult:cols
      cField := oPGResult:fname(i-1)
      IF SUBSTR(cField,1,2) = "__"
      ELSE
         oBr:addColumn( MakeFieldBlock( oPGResult, cField ), , cField )
      ENDIF
   next

Function MakeFieldBlock( o, c )
   IF IsMemberVar(o,c)
      return {|| o:&(c) }
   ENDIF
   IF IsMethod(o,c)
      return {|| o:&c }
   ENDIF
return {|| .T. }
er sagt aber kein Member und keine Method ... was ist ein "Feld" dann bei PostgreSQL ?
Zuletzt geändert von AUGE_OHR am Mo, 25. Jun 2012 1:53, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von brandelh »

Hallo Jimmy,

ich würde an deiner Stelle tatsächlich den gefundenen Inhalt in ein Array umschaufeln !

Deine Abfrage liefert ja einen Cursor zurück, je nach Datenbank und Einstellung können die nur vorwärts springen und sind read only.
Wie Xbase++ das in der DBE umsetzt weiß ich nicht, aber mit einem Array bist du auf der sicheren Seite ...
Gruß
Hubert
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von AUGE_OHR »

hi,

Phil Ide hat ja die myPGSQLBrowse Class geschrieben. sein original Code, für v7.3, sieht so aus

Code: Alles auswählen

      if oPG:exec(cSQL)
*        oHRTimer:stop()

         oRes := oPG:result
         aFNames := oRes:getFieldnames()        // Method "vorhanden"

         // the lazy way...
         //
         nH := FCreate('result1.txt')
         while !oRes:eof()
            cLine := ''
            for i := 1 to Len(aFNames)
               cLine += oRes:&(aFNames[i])+'  '     // hier das & Macro
            next
            FWrite( nH, cLine+CRLF )
            oRes:skip() // could be oRes:skip(-1)
         enddo
         FClose(nH)
ich weiss nicht "wie" das Phil geschafft hat aber "das" Macro macht er bei mir "so" nicht -> crash "no MemberVar".

wie soll denn eine MemberVar, als "Feld" Name, "dynamisch" angelegt werden ... mit Xbase++ v1.8x die Phil damals zur Verfügung hatte ?
hier die vorhandelen MemberVar

Code: Alles auswählen

   o := PGResult():new(::connID,x)
   return o

CLASS PGResult
   EXPORTED:
      VAR resID READONLY
      VAR curTuple READONLY
      VAR connID
      VAR rows
      VAR cols
      VAR message
gruss by OHR
Jimmy
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von brandelh »

Da gibt es doch die :set/getNoIVar() Methode (ob bei 1.82 auch schon ? ), die aber sehr langsam ist.
Daher kommen ja die neuen DatenObjekte mit Xbase++ 2.0, die sollen das automatisch machen.

Eventuell braucht Phil's code aber auch genau die 1.82 :? ...
:set/getNoIVar()- Verarbeitet Schreib- bzw. Lesezugriffe auf nicht definierte Instanzvariablen
Gruß
Hubert
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Da gibt es doch die :set/getNoIVar() Methode (ob bei 1.82 auch schon ? ), die aber sehr langsam ist.
hm ... bei Phil gibt es eine Method

Code: Alles auswählen

METHOD PGResult:NoIvarCallBack(x)
   local i
   local xRet

   i := PQfnumber(::resID, ::message)
   if i >= 0
      xRet := ::getValue(::curTuple, i)
   else
      ::noIvar(x)
   endif
   return xRet

METHOD PGResult:NoIvar( x )
   local o := Error():new()

   o:args            := x
   o:canDefault      := FALSE
   o:canRetry        := FALSE
   o:canSubstitute   := FALSE
   o:description     := "invalid field name"
   o:operation       := ::className()+":"+::message
   o:severity        := XPP_ES_ERROR
   o:subSystem       := ::className()
   o:thread          := ThreadID()
   Eval( ErrorBlock(), o )
   return self
aber ich habe keinen Hinweis das die Method verwendet wird ... es gibt ja den Absturz mit der v1.9.355
brandelh hat geschrieben:Daher kommen ja die neuen DatenObjekte mit Xbase++ 2.0, die sollen das automatisch machen.
das war Phil wohl der Zeit wiedermal vorraus ;)
brandelh hat geschrieben:Eventuell braucht Phil's code aber auch genau die 1.82 :? ...
hm ... zumindest hab ich festgestellt das er die libpq.dll v7.2.1 verwendet und die mit der v8.x nicht so recht geht.
deshalb hab ich die ot4xb Version von
Osvaldo Ramirez
xfree.public
PostgreSQL
07.05.2008
genommen die aber (leider) keine Class hat ... nur die API Aufrufe ...
nun habe ich Phil´s Class mit Osvaldo´s v8.x API Aufrufen kombiniert und damit Zugriff auf "das" MDIDEMO von der Devcon Build.

hm ... kann man einen SQL String in einen Codeblock verwenden ?

Code: Alles auswählen

oPG := PGSql():new()
cSQL := "[SELECT ...]"
bBlock := "{|| MySQLcmd( oPG,"+cSQL +") }"
oCol:datalink := &bBlock
gruss by OHR
Jimmy
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von brandelh »

AUGE_OHR hat geschrieben:hm ... zumindest hab ich festgestellt das er die libpq.dll v7.2.1 verwendet und die mit der v8.x nicht so recht geht.
vermutlich wird man genau die richtige API-DLL für den aktuellen Server brauchen ... Schnittstellen können sich ändern.
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von georg »

Hallo, Jimmy -


PGSql:exec() verwendete PGResult(), um das result set abzulegen.

Du kannst doch dann in der PGResult() Klasse eine Methode :FieldGet(xID) implementieren, die Dir aus dem Satz, auf den ::curTuple zeigt, das entsprechende Feld zurückliefert.


Gruss,

Georg
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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von AUGE_OHR »

georg hat geschrieben:Du kannst doch dann in der PGResult() Klasse eine Methode :FieldGet(xID) implementieren, die Dir aus dem Satz, auf den ::curTuple zeigt, das entsprechende Feld zurückliefert.
so langsam fange ich an zu verstehen ...
API, "Connect", "Result" und die Navigation ( SKIP, FIND) sind bei Phil´s Class enthalten aber das "Table I/O" fehlt.

Code: Alles auswählen

FieldGet() 
FieldPut()
FieldName()
FieldPos()
ist klar aber was ist mit FieldBlock() ?
für ein Browse, nicht Array, benötige eine o:datalink und dafür einen Codeblock ... oder ?
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von georg »

Hallo, Jimmy -


die mir vorliegende Version von Phil hat eine Lösung für Dein Problem, und zwar in der pqtest.prg:

Code: Alles auswählen

Zeile 142ff:
   for i := 1 to oPGResult:cols
      cField := oPGResult:fname(i-1)
      oBr:addColumn( MakeFieldBlock( oPGResult, cField ), , cField )
   next

Code: Alles auswählen

Zeile 158ff:
Function MakeFieldBlock( o, c )
   return {|| o:&(c) }
Was das angeht, kann ich nur raten (vielleicht ist ja jemand da, der diesen Trick aus der Erfahrung kennt): Phil benutzt

Code: Alles auswählen

      ACCESS ASSIGN METHOD NoIvarCallBack
Diese Methode sieht so aus:

Code: Alles auswählen

METHOD PGResult:NoIvarCallBack(x)
   local i
   local xRet

   i := PQfnumber(::resID, ::message)
   if i >= 0
      xRet := ::getValue(::curTuple, i)
   else
      ::noIvar(x)
   endif
   return xRet
Scheinbar wird diese Methode aufgerufen, wenn eine iVar nicht gefunden wird.

Update: die Xbase++ Dokumentation bestätigt dies. Mal wieder was dazugelernt.

PQfnumber ist eine PostgreSQL Funktion, die scheinbar die Spaltennummer eines Feldes zurückliefert. Mit diesem Index wird über ::getValue() auf die aktuelle Zeile (::curTuple) im Result Set zugegriffen, und das i-te Element zurückgeliefert.

Das erinnert mich so sehr an No-Link (wer kennt diesen Clipper-Link-Beschleuniger noch), hier wird - wenn meine Vermutung richtig ist - das Fehlersystem "missbraucht", um den Zugriff auf oPGResult:meinFeld abzufangen und dann den Feldinhalt zu liefern. Gibt es keine Spalte dieses Namens, gibt es eine gepflegte Fehlermeldung.

Hilft Dir das?


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von UliTs »

georg hat geschrieben:Scheinbar wird diese Methode aufgerufen, wenn eine iVar nicht gefunden wird.
Richtig :-)
Aber nicht nur scheinbar :badgrin:

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von georg »

Hallo, UliT -


ja, aber das Problem steckt im Detail, denn wenn ein Feld den gleichen Namen wie eine bestehende iVar hat, würde Phil's Klasse den Wert der definierten iVar und NICHT den Wert des Tabellenfeldes liefern.

Aber ich hatte ja schon eingestanden, solche Wege bisher nicht beschritten zu haben :blob8:


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von UliTs »

Georg,

da hast Du sicher Recht! Mein Posting war mehr "witzig" gemein als produktiv.
Ich kenne Phil's Klasse nicht.
Aber ausschließlich den Feldnamen als Bezeichnung für eine "nichtexistierende" iVar zu nehmen, halte ich für viel zu unsicher.
Besser wäre, wenn die Feldnamen auf IVar's wie Field+Feldname = FieldStrasse für das Tabellenfeld "Strasse" genommen werden/würden.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von georg »

Hallo, Uli -


dahin ging ja auch meine erste Empfehlung an Jimmy, eine zusätzliche Methode :FieldGet() zu implementieren, die dann etwa so aussehen könnte:

Code: Alles auswählen

METHOD PGResult:FieldGet(xIdx)
   Local nPos
   nPos := PQfnumber(::resID, ::message)
   IF nPos > 0
      RETU(::getValue(::curTuple, nPos)
   ELSE
      // was immer man im Fehlerfall machen will
   ENDIF
RETURN (NIL)
Was meines Ermessens zu überprüfen ist: zählt PostgreSQL die Feldpositionen ab Null (wie SQLite), oder aber 1? Falls ab Null gezählt wird, wäre eine Anpassung RETU(::getValue(::curTuple, nPos + 1) erforderlich.

Mit dieser Methode wäre man auf der sicheren Seite, was den Zugriff angeht.


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von brandelh »

Wobei hier eigentlich nicht die Feldnummer in der Datenbank gemeint sein kann, sondern die im Cursor.
Gruß
Hubert
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von UliTs »

Außerdem würde ich nicht mit Feldnummern arbeiten.
Ist in PG wie in DBF überhaupt garantiert, dass diese sich nicht ändern?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von georg »

Hallo, Uli -


bei SQL musst Du Dich von solchen Dingen "trennen".

Unterstelle eine Datei mit den Feldern

FELD1
FELD2
FELD3
FELD4
FELD5

bei einem

Code: Alles auswählen

SELECT * FROM datei
gilt bezüglich der Feldposition

FELD1 = 1
FELD2 = 2
FELD3 = 3
FELD4 = 4
FELD5 = 5

Ruft man aber ein

Code: Alles auswählen

SELECT FELD1, FELD3, FELD4 FROM datei
ab, so gilt bezüglich der Feldposition

FELD1 = 1
FELD3 = 2
FELD4 = 3

Man sollte also immer den Weg über den Feldnamen wählen (bei der Verwendung einer :FieldGet() Methode).

Denke an eine Datei, die etliche Memo-Felder enthält, und bei der nur fünf oder sechs relevante Informationen enthalten, die auch am Bildschirm im Browse angezeigt werden sollen. In diesem Fall nimmt man eben kein

Code: Alles auswählen

SELECT * FROM datei
sondern

Code: Alles auswählen

SELECT Feld1, Feld2, ... Feldn FROM datei
was bei Dateien mit entsprechend vielen/grossen Feldern zu deutlichen Geschwindigkeitsgewinnen führen kann/soll.


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von UliTs »

Hallo Georg,

dann sind wir ja einer Meinung :-) .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von AUGE_OHR »

georg hat geschrieben:Phil benutzt

Code: Alles auswählen

      ACCESS ASSIGN METHOD NoIvarCallBack
Diese Methode sieht so aus:

Code: Alles auswählen

METHOD PGResult:NoIvarCallBack(x)
   local i
   local xRet

   i := PQfnumber(::resID, ::message)
   if i >= 0
      xRet := ::getValue(::curTuple, i)
   else
      ::noIvar(x)
   endif
   return xRet
Scheinbar wird diese Methode aufgerufen, wenn eine iVar nicht gefunden wird.

Update: die Xbase++ Dokumentation bestätigt dies. Mal wieder was dazugelernt.
WOW das hab ich übersehen. ich habe allerdings keine Ahnung "wie" das "aktiviert" werden soll statt "Absturz"

ich werde wohl doch die Method Fieldget() / FieldPut() in die Class einbauen.
wenn ich die "Feld" Namen habe kann ich ja mit ASCAN() die "Position" feststellen

die Frage ist nur ob ich mich weiter an einem o:Datalink versuche wie Phil oder gleich auf eine komplette Array Verwaltung setzte wie bei Hector mit seinem MySQL "Wrapper"
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von georg »

Hallo, Jimmy -


mit der Verwendung der ACCESS ASSIGN METHOD wird das "aktiviert".

Grundsätzlich (und immer wieder) der Hinweis, dass man bei SQL nur das "anfragt", was man auch braucht, das gilt sowohl bei der Auswahl der Felder, als auch bei der Auswahl der Sätze. ein SELECT * FROM table kann bei grossen Tabellen mit vielen Felder katastrophale Folgen haben.

Sowohl Phil's als auch Hector's Klassen lesen das gesamte Ergebnis in ein Array ein, und das braucht Speicherplatz. Daher sollte das SELECT eingegrenzt werden, entweder in der Form

SELECT <feldliste> FROM table WHERE <bedingung>

oder

SELECT <feldliste> FROM table WHERE <bedingung> LIMIT 0 OFFSET 100

wobei unterschiedliche Server das LIMIT/OFFSET Paar schon mal so und mal so erwarten.

Mit einem

SELECT COUNT(*) FROM table WHERE <bedingung>

erfährt man, wieviele Sätze zu erwarten sind, und kann dann in zwei Schleifen die Daten anfordern und verarbeiten:

Code: Alles auswählen

nMax := SELECT COUNT(*) FROM table WHERE <bedingung>
FOR nI := 1 TO nMax STEP 100
   aSet := SELECT <feldliste> FROM table WHERE <bedingung> LIMIT nI-1 OFFSET 100
   FOR nJ := 1 TO Len(aSet)
      ... Verarbeitung ...
   NEXT
NEXT
Ich hoffe, Ihr könnt den Pseudo-Code ab.

Es gibt immer noch die Möglichkeit, einen CURSOR zu erstellen und den auszulesen, aber soweit bin ich noch mit keinem Server-Interface gekommen. In dem Fal verhält sich der Cursor "fast" wie eine DBF-Datei, die man sequentiell verarbeiten will.


Gruss,

Georg
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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von AUGE_OHR »

georg hat geschrieben:mit der Verwendung der ACCESS ASSIGN METHOD wird das "aktiviert".
ich habe mir das Beispiel :set/getNoIVar() aus der Abstract() Class angesehen und das Demo läuft.

ich bekomme es "so" aber nicht mit Phils "original" Source zu laufen weil er "trotzdem" meckert ?

ich habe nun den Code von Phil nach deinen Hinweisen modifiziert und es funktioniert ;)

Code: Alles auswählen

Function MakeFieldBlock( o, c )
return {|| o:DataBlock(c) }

// neue Method
METHOD PGResult:DataBlock(cFname)
   LOCAL aFields := ::getFieldNames()
   LOCAL nPosi   := 0
   LOCAL xRet    := ""

   DEFAULT cFname TO ""

   nPosi := ASCAN(aFields,{|x| x = cFname} )
   IF nPosi > 0
      xRet := ::getValue(::curTuple, nPosi)
   ENDIF
   return xRet
und damit bekomme ich einen "lauffähigen" Codeblock für Phil´s Browse ;)
danke für die Tips =D>
georg hat geschrieben:Grundsätzlich (und immer wieder) der Hinweis, dass man bei SQL nur das "anfragt", was man auch braucht, das gilt sowohl bei der Auswahl der Felder, als auch bei der Auswahl der Sätze. ein SELECT * FROM table kann bei grossen Tabellen mit vielen Felder katastrophale Folgen haben.
verstanden ;)
georg hat geschrieben:Sowohl Phil's als auch Hector's Klassen lesen das gesamte Ergebnis in ein Array ein, und das braucht Speicherplatz.
YUP ... aber bei Hector gibt es die Method ::Where() die er beim "Zusammenbau" eines "SELECT " String anfügt.
georg hat geschrieben:Daher sollte das SELECT eingegrenzt werden, entweder in der Form
SELECT <feldliste> FROM table WHERE <bedingung>
oder
SELECT <feldliste> FROM table WHERE <bedingung> LIMIT 0 OFFSET 100

wobei unterschiedliche Server das LIMIT/OFFSET Paar schon mal so und mal so erwarten.

Mit einem
SELECT COUNT(*) FROM table WHERE <bedingung>

erfährt man, wieviele Sätze zu erwarten sind, und kann dann in zwei Schleifen die Daten anfordern und verarbeiten:

Code: Alles auswählen

nMax := SELECT COUNT(*) FROM table WHERE <bedingung>
FOR nI := 1 TO nMax STEP 100
   aSet := SELECT <feldliste> FROM table WHERE <bedingung> LIMIT nI-1 OFFSET 100
   FOR nJ := 1 TO Len(aSet)
      ... Verarbeitung ...
   NEXT
NEXT
Ich hoffe, Ihr könnt den Pseudo-Code ab.
YUP , danke

Frage eines Newbie : was ist "LIMIT/OFFSET" ?
georg hat geschrieben:Es gibt immer noch die Möglichkeit, einen CURSOR zu erstellen und den auszulesen, aber soweit bin ich noch mit keinem Server-Interface gekommen. In dem Fall verhält sich der Cursor "fast" wie eine DBF-Datei, die man sequentiell verarbeiten will.
em, äh, ja ... ?

ich "dachte" an folgenden Ablauf :
1.) Anzeige / Auswahl Server
2.) Anzeige Tabellen -> Auswahl Tabelle
3.) Anzeige "Felder" -> Auswahl "Felder" ( default alle )
4.) weiter Bedingungen auf "Felder" setzen ( pro "Feld" )
5.) Auswahl "Felder" für Browse ( default alle )
nun wird "intern" der "SELECT " String gebildet
6.) Browse
7.) Neu
8.) Edit
9.) Delete
10.) PACK ?
gruss by OHR
Jimmy
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von UliTs »

AUGE_OHR hat geschrieben:...YUP ... aber bei Hector gibt es die Method ::Where() die er beim "Zusammenbau" eines "SELECT " String anfügt...
Hallo Jimmy,
die "Where"-Klausel schränkt die Anzahl der Datensätze ein.
Wenn man statt "*" einzelne Spalten = Felder aufführt, schränkt dies die Anzahl der Spalten ein.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von UliTs »

AUGE_OHR hat geschrieben:
georg hat geschrieben:Es gibt immer noch die Möglichkeit, einen CURSOR zu erstellen und den auszulesen, aber soweit bin ich noch mit keinem Server-Interface gekommen. In dem Fall verhält sich der Cursor "fast" wie eine DBF-Datei, die man sequentiell verarbeiten will.
em, äh, ja ... ?
Mit einem Cursor kannst Du auf der SQL-Tabelle auch Skip-Bewegungen etc. durchführen.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von AUGE_OHR »

UliTs hat geschrieben:
AUGE_OHR hat geschrieben:...YUP ... aber bei Hector gibt es die Method ::Where() die er beim "Zusammenbau" eines "SELECT " String anfügt...
Hallo Jimmy,
die "Where"-Klausel schränkt die Anzahl der Datensätze ein.
Wenn man statt "*" einzelne Spalten = Felder aufführt, schränkt dies die Anzahl der Spalten ein.
s.h. 3.)
3.) Anzeige "Felder" -> Auswahl "Felder" ( default alle )
danach kann ich dann auf die "Feld"er eine Bedingung ( ::where() ) setzten.

das funktioniert schon ganz gut inklusive 6.) Browse auf die MDIDEMO "customer".

Frage : sind "Table" und "Feld" Namen immer LOWER() ?
gruss by OHR
Jimmy
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von UliTs »

AUGE_OHR hat geschrieben:...
3.) Anzeige "Felder" -> Auswahl "Felder" ( default alle )
danach kann ich dann auf die "Feld"er eine Bedingung ( ::where() ) setzten.
Natürlich!
Aber Du schränkst damit die Anzahl der Zeilen und NICHT die Anzahl der Spalten ein!

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
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: PostgreSQL "Feld" Namen -> Codeblock ?

Beitrag von UliTs »

AUGE_OHR hat geschrieben:Frage : sind "Table" und "Feld" Namen immer LOWER() ?
Nein!
Ich glaube, es gibt keinen SQL-Dialekt, bei dem nur kleingeschriebene Tabellen- und Feldnamen erlaubt sind.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten