* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 24, 2024, 08:45:16 am

Inserisci il nome utente, la password e la durata della sessione.

61 Visitatori, 0 Utenti

Autore Topic: Aggiungere campo al dataset  (Letto 8029 volte)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3276
  • Karma: +12/-0
Aggiungere campo al dataset
« il: 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?!
Ieri è passato, domani è futuro, oggi è un dono...

bonmario

  • Hero Member
  • *****
  • Post: 1360
  • Karma: +11/-1
Re:Aggiungere campo al dataset
« Risposta #1 il: 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;

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3276
  • Karma: +12/-0
Re:Aggiungere campo al dataset
« Risposta #2 il: 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
Ieri è passato, domani è futuro, oggi è un dono...

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3276
  • Karma: +12/-0
Re:Aggiungere campo al dataset
« Risposta #3 il: 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;
Ieri è passato, domani è futuro, oggi è un dono...

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3276
  • Karma: +12/-0
Re:Aggiungere campo al dataset
« Risposta #4 il: 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
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Aggiungere campo al dataset
« Risposta #5 il: 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...
« Ultima modifica: Febbraio 06, 2014, 01:13:05 pm da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3276
  • Karma: +12/-0
Re:Aggiungere campo al dataset
« Risposta #6 il: 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.
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Aggiungere campo al dataset
« Risposta #7 il: 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
« Ultima modifica: Febbraio 06, 2014, 07:18:30 pm da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3276
  • Karma: +12/-0
Re:Aggiungere campo al dataset
« Risposta #8 il: Febbraio 06, 2014, 09:12:36 pm »
Non ci credoooooooooo

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

Hahahahahaha

 ;)
Ieri è passato, domani è futuro, oggi è un dono...

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3276
  • Karma: +12/-0
Re:Aggiungere campo al dataset
« Risposta #9 il: 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)
Ieri è passato, domani è futuro, oggi è un dono...

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19180
  • Topic in totale: 2288
  • Online Today: 97
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 61
Total: 61

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.