Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: xinyiman - Gennaio 30, 2014, 04:53:11 pm

Titolo: Aggiungere campo al dataset
Inserito da: xinyiman - Gennaio 30, 2014, 04:53:11 pm
Ciao ragazzi ho il seguente problema.
Immaginiamo che ho la seguente query

select campo1, campo2 from tabella;

e per mie ragioni personali necessito di avere nella DBGrid anche il campo3 (che non esiste nella tabella) ma che mi serve per fare dei miei calcoli.

Come posso fare a run time?! E possibilmente dopo che ho già aperto la query?!
Titolo: Re:Aggiungere campo al dataset
Inserito da: bonmario - Gennaio 30, 2014, 07:43:07 pm
Ciao, al lavoro dovrei avere qualcosa di simile, anche se usato all'interno della suite Kettle di Pentahoo.
Vado a memoria sperando di ricordarmi bene, in caso contrario, fammi sapere ...

Codice: [Seleziona]
select 
campo1,
campo2,
campo3     NUMBER(3)

from tabella;
Titolo: Re:Aggiungere campo al dataset
Inserito da: xinyiman - Gennaio 30, 2014, 07:54:50 pm
Sto creando una unit apposita, al momento è questa:

Codice: [Seleziona]
unit Unit_CampoComboDBGrid;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, db, Grids;


function AddDBComboBoxToGrid(NomeNuovoCampo: string; DataSet: TDataSet; CampoDataSet: string ;DataSetList: TDataSet; ChiaveLista: string; CampoLista: string): boolean;

implementation

              function AddDBComboBoxToGrid(NomeNuovoCampo: string; DataSet: TDataSet; CampoDataSet: string ;DataSetList: TDataSet; ChiaveLista: string; CampoLista: string): boolean;
              var
                i: integer;
                Field:TField;
                ret: boolean;
              begin
                     ret:=false;
                     try
                        try
                           DataSet.Active:=False;
                           for i:=0 to DataSet.FieldDefs.Count-1 do
                             Field:=DataSet.FieldDefs[i].CreateField(DataSet);

                           Field:=TStringField.Create(DataSet);
                           with Field do
                           begin
                             FieldName:=NomeNuovoCampo;
                             Dataset:=DataSet;
                             FieldKind := fkLookup; //QUI DICO CHE E' UNA COMBOBOX
                             LookupDataSet:=DataSetList; //QUI ASSEGNO IL DATASET DA CUI EREDITARE I DATI DA FAR VEDERE NELLA COMBOBOX
                             LookupCache:=FALSE;
                             LookupKeyFields:=ChiaveLista;//'CHIAVE'; //CHIAVE CHE VERRA' INSERITA NEL CAMPO Temf.KeyFields
                             LookupResultField:=CampoLista;//'NOME'; //VALORE CHE VEDI NELLA COMBOBOX DA SELEZIONE
                             ReadOnly:=FALSE; //SOLA LETTURA
                             ProviderFlags:=[pfInUpdate, pfInWhere];
                             Required:=FALSE;
                             KeyFields:=CampoDataSet;//'CHIAVEPV';
                           end;
                           DataSet.Active:=True;
                           ret:=TRUE;
                        finally
                       end;
                     except
                           on E: Exception do
                           begin

                           end;
                     end;
                     result:=ret;
              end;
end.

Al momento non funziona, ma se metto tale codice all'interno della form dopo che ho aperto la query e quindi non passando per una funzione allora magicamente funziona tutto. Probabilmente qualcosa da rivedere nei parametri della funzione (puntatori). Ma appena sono + lucido la sistemo e la condivido funzionante
Titolo: Re:Aggiungere campo al dataset
Inserito da: xinyiman - Febbraio 01, 2014, 03:23:26 pm
Ho provato il seguente codice e funziona, ma a me serve che sia una combobox e non solo un campo.

Codice: [Seleziona]
Procedure AddCalcStringField(Table1: tDataset; fName,fDisplay:String;
Size:
Integer);
{ Adds a calculated tStringField to a table at runtime}
var
f : TField;
i : integer;
begin
Table1.FieldDefs.Update;
Table1.Close;
for i := 0 to Table1.FieldDefs.Count - 1 do
if table1.FindField(table1.FieldDefs[i].Name) = nil then
table1.FieldDefs.Items[i].CreateField(Table1);

if table1.FindField(fName) <> nil then
Exit;

f := tStringField.Create(Table1);
f.Name := Table1.Name+fName;
f.FieldName := fName;
f.DisplayLabel := fDisplay;
f.Calculated := True;
f.DataSet := Table1;
Table1.Open;
end;

Allora ho provato a modificare il codice così? Ma la seguente riga

FieldKind := fkLookup; // <--ERROR

manda il loop il mio programma. Perchè?

Ecco il mio codice attuale

Codice: [Seleziona]
Procedure AddCalcStringField(fName: string;fDisplay:String;Size:Integer;Table1: tDataset; CampoDataSet: string; DataSetList: TDataSet; ChiaveLista: string; CampoLista: string);
{ Adds a calculated tStringField to a table at runtime}
var
f : TField;
i : integer;
begin
Table1.FieldDefs.Update;
Table1.Close;
for i := 0 to Table1.FieldDefs.Count - 1 do
if table1.FindField(table1.FieldDefs[i].Name) = nil then
table1.FieldDefs.Items[i].CreateField(Table1);

if table1.FindField(fName) <> nil then
Exit;

f := tStringField.Create(Table1);
with f do
begin
  FieldName := Table1.Name+fName;
  Name := fName;
  DisplayLabel := fDisplay;
  Calculated := True;
  DataSet := Table1;

  //FieldKind := fkLookup; //QUI DICO CHE E' UNA COMBOBOX

  LookupDataSet:=DataSetList; //QUI ASSEGNO IL DATASET DA CUI EREDITARE I DATI DA FAR VEDERE NELLA COMBOBOX
  LookupCache:=FALSE;
  LookupKeyFields:=ChiaveLista;//'CHIAVE'; //CHIAVE CHE VERRA' INSERITA NEL CAMPO Temf.KeyFields
  LookupResultField:=CampoLista;//'NOME'; //VALORE CHE VEDI NELLA COMBOBOX DA SELEZIONE

  ReadOnly:=FALSE; //SOLA LETTURA
  ProviderFlags:=[pfInUpdate, pfInWhere];
  Required:=FALSE;
  KeyFields:=CampoDataSet;//'CHIAVEPV';

end;
Table1.Open;
end;
Titolo: Re:Aggiungere campo al dataset
Inserito da: xinyiman - Febbraio 03, 2014, 01:42:28 pm
Ho fatto, un esempio di prova. Qualcuno mi da una mano a capire come posso ovviare al problema?

Dovete avere solo Zeos installato come package.
Decomprimete e compilate. Poi se schiacciate su button1 vedrete che funziona, ma se premete su button 2 vedrete che non cambia nulla.

Inoltre se provate un pulsante poi riavviate il programma e provate l'altro perchè altrimenti va in errore.

Grazie mille
Titolo: Re:Aggiungere campo al dataset
Inserito da: nomorelogic - Febbraio 06, 2014, 01:06:45 pm
ciao
ho installato le zeos 7.1.2 stable in lazarus (lazarus 1.3 con fpc 2.6.3)
quando apro il tuo progetto ricevo il seguente errore:

Stream=TForm1: Root=:TForm1
Component Class: TZConnection
Error reading ZConnection1.UTF8StringsAsWideField: Unknown property: "UTF8StringsAsWideField"
Stream position: 1182

tu che versione di laz/fpc stai usando?


Edit:
cmq facendo la build non ho errori ed il programma parte...
Titolo: Re:Aggiungere campo al dataset
Inserito da: xinyiman - Febbraio 06, 2014, 03:55:02 pm
Lazarus: 1.0.10
FPC: 2.6.2

Quell'errore te lo da per via di una versione diversa di lazarus, il problema non è quello. Anche a me il programma va, ma se premo il pulsante button1 il programma funziona correttamente, se poi riavvio e premo il button2 non fa quello che dovrebbe fare. Il codice del button2 è lo stesso del button1 solo che messo in una funzione/procedura contenuta in una unit a parte. Insomma volevo farne una unit che fosse comoda da riutilizzare e renderla pubblica a tutti.
Titolo: Re:Aggiungere campo al dataset
Inserito da: nomorelogic - Febbraio 06, 2014, 07:14:18 pm
l'arcano è tutto nella unit: Unit_CampoComboDBGrid

il codice che non va è il seguente:
Codice: [Seleziona]
                           function AddDBComboBoxToGrid(NomeNuovoCampo: string;DataSet: TDataSet; ...
                           Field:=TStringField.Create(DataSet);
                           with Field do
                           begin

                             ...
                             Dataset:=DataSet;
                             ...

                           end;   

evidentemente il compilatore fa confusione nell'interpretare la prima occorrenza di 'DataSet' come proprietà di Field invece che come parametro..
togli il with o cambia nome al parametro ;)


Edit:
ok, ok è una cosa strana
però te la sei cercata :D :D :D
Titolo: Re:Aggiungere campo al dataset
Inserito da: xinyiman - Febbraio 06, 2014, 09:12:36 pm
Non ci credoooooooooo

Nomore, sei un angelo...e io sono proprio un pirla...

Hahahahahaha

 ;)
Titolo: Re:Aggiungere campo al dataset
Inserito da: xinyiman - Febbraio 06, 2014, 10:18:44 pm
Funziona bene con le zeos, ma non con i TBufDataSet. Oggi e domani ci provo e mal che vada torno a tormentarvi.  8)