Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: antoniog - Marzo 31, 2021, 07:42:32 pm

Titolo: Copia da memo in memo incompleta
Inserito da: antoniog - Marzo 31, 2021, 07:42:32 pm
Lazarus 2.0.6x64 - Zeos 7.1.4-stable  - SQLite3
Buonasera,
oggi ho scoperto che la copia del contenuto di un campo memo da una tabella in un'altro campo memo di altra tabella dello stesso database non avviene completamente, il secondo campo memo è circa la metà del primo.
In SQLite sono entrambi - TEXT - e in FPC entrambi - ftMemo -
per prova faccio questo:
Codice: [Seleziona]
mcod:='28.A05.D05.005'; // ArticoliCODICE.Text;
if not TotArti.Locate('CODICE', mcod, []) then informa('codice non trovato') else
    if Articoli.Locate('CODICE', mcod, []) then
        begin
            Totarti.Edit;
            Totarti.FieldValues['annotazion']:=Articoli.FieldValues['annotazion'];
             Totarti.Post;
         end;

ho provato molti modi ma non ho trovato la soluzione, il testo copiato è sempre circa la metà di quello originale.

Anche copiando manualmente l'intero testo nel secondo memo il risultato non cambia, ne viene memorizzato solo la metà.

Cosa mai potrà essere?
Titolo: Re:Copia da memo in memo incompleta
Inserito da: nomorelogic - Marzo 31, 2021, 09:41:31 pm
penso che dovresti provare con gli stream
Titolo: Re:Copia da memo in memo incompleta
Inserito da: antoniog - Aprile 01, 2021, 03:10:51 pm
nomorelogic, e come?
Titolo: Re:Copia da memo in memo incompleta
Inserito da: nomorelogic - Aprile 01, 2021, 03:55:24 pm
Prova qualcosa tipo:

Codice: [Seleziona]
var
  stream: TMemoryStream;
...

  mcod := '28.A05.D05.005'; // ArticoliCODICE.Text;
  if not TotArti.Locate('CODICE', mcod, []) then
     informa('codice non trovato')
  else
  if Articoli.Locate('CODICE', mcod, []) then
     begin
       stream := TMemorySTream.Create;
       try
         BlobField(Articoli.FieldByName('annotazion')).SaveToStream(stream);
         stream.Position := 0;
         Totarti.Edit;
         BlobField(Totarti.FieldByName('annotazion')).LoadFromStream(stream);
         // Totarti.FieldValues['annotazion'] := Articoli.FieldValues['annotazion'];
         Totarti.Post;
       finally
         FreeAndNil(stream);
       end;
     end;





Edit:
commentata istruzione da sostituire
Titolo: Re:Copia da memo in memo incompleta
Inserito da: antoniog - Aprile 01, 2021, 05:22:31 pm
Error: Identifier not found "BlobField"
Titolo: Re:Copia da memo in memo incompleta
Inserito da: antoniog - Aprile 02, 2021, 01:21:51 am
ho trovato e capito che il campo memo viene completamente riempito con:
Codice: [Seleziona]
Totarti.FieldValues['annotazion'] := Articoli.FieldValues['annotazion'];

o con:

Codice: [Seleziona]
TotartiAnnotazion.Text:=ArticoliAnnotazion.AsString;

ma poi viene visualizzato in misura ridotta (circa la metà) sia a schermo che in stampa
Titolo: Re:Copia da memo in memo incompleta
Inserito da: nomorelogic - Aprile 02, 2021, 09:04:37 am
Error: Identifier not found "BlobField"

scusa era TBlobField (si trova nella unit DB)
non avevo compilato
Titolo: Re:Copia da memo in memo incompleta
Inserito da: antoniog - Aprile 02, 2021, 10:27:47 am
nomorelogic, grazie ma in esecuzione mi da errore: invalid type cast
Titolo: Re:Copia da memo in memo incompleta
Inserito da: xinyiman - Aprile 02, 2021, 11:21:19 am
ho trovato e capito che il campo memo viene completamente riempito con:
Codice: [Seleziona]
Totarti.FieldValues['annotazion'] := Articoli.FieldValues['annotazion'];

o con:

Codice: [Seleziona]
TotartiAnnotazion.Text:=ArticoliAnnotazion.AsString;

ma poi viene visualizzato in misura ridotta (circa la metà) sia a schermo che in stampa


Domanda stupida: se usi lazreport hai provato ad allargare il rettangolo in cui fai visualizzare quel dato?
Titolo: Re:Copia da memo in memo incompleta
Inserito da: antoniog - Aprile 02, 2021, 11:50:19 am
xinyiman,
la cosa strana è che in entrambe le tabelle (articoli e totarti) il campo annotazioni in sqlite3 è TEXT ed in Lazarus ftMemo
con tabella articoli -in dbmemo- la descrizione è completa
mentre con tabella totarti -sempre in dbmemo- la visualizzazione della descrizione è tagliata.


Ho provato a fare una nuova applicazione collegando lo stesso database e tutto funziona perfettamente, le due tabelle hanno gli stessi valori e posso copiare i dati da una all'altra senza perdere valori,


quindi deduco che sia un problema relativo al mio programma, a qualche accidenti di configurazione da qualche parte che mi modifica le caratteristiche della tabella Totarti.
Titolo: Re:Copia da memo in memo incompleta
Inserito da: antoniog - Aprile 02, 2021, 12:00:25 pm
anche con Lazreport articoli.annotazion viene stampata per intero mentre totarti.annotazion viene stampata troncata
Titolo: Re:Copia da memo in memo incompleta
Inserito da: antoniog - Aprile 02, 2021, 05:11:19 pm
quello che ho scoperto
le due tabelle sono in un Modulo Dati
ho copiato Totarti nella Form principale, cambiato i collegamenti, e tutto funziona anche la stampa con Lazreport,
quindi il problema è nel Modulo Dati, infatti inserendo un'altra ZTable  questa non viene riconosciuta come parte integrante del Modulo Dati e mi segnala errore.
Qualche soluzione??
Titolo: Re:Copia da memo in memo incompleta
Inserito da: xinyiman - Aprile 04, 2021, 09:34:19 pm
quello che ho scoperto
le due tabelle sono in un Modulo Dati
ho copiato Totarti nella Form principale, cambiato i collegamenti, e tutto funziona anche la stampa con Lazreport,
quindi il problema è nel Modulo Dati, infatti inserendo un'altra ZTable  questa non viene riconosciuta come parte integrante del Modulo Dati e mi segnala errore.
Qualche soluzione??

Lo hai segnalato alla community internazionale?
Titolo: Re:Copia da memo in memo incompleta
Inserito da: antoniog - Aprile 09, 2021, 02:44:28 am
ho risolto in modo anomalo.
ho creato un nuovo datamodulo chiamato DataProgetto ed ho copiato, copia ed incolla, tutto il contenuto di Dataproge, ho cambiato tutti i riferimenti nel programma e nei report ed ho risolto. Provando a rinominare il nuovo modulo dati col nome originale il problema si ripresenta.
Sembra strano ma sembrerebbe che Dataproge non accetti modifice alle Ztabelle perchè tempo fa ho cambiato il campo 'annotazion' della tabella Totarti (sqlite) da 'varchar' a 'text' e modificato il campo anche su Lazarus inserendo 'ftMemo'. Queste modifiche  vengono visualizzate ma poi non vengono elaborate, come se il datamodule prendesse i dati da un file memorizzato da qualche altra parte e non in quello di progetto.

Xinyiman,non ho ancora segnalato il problema alla community internazionale, se cortesemente mi dai i riferimenti lo faccio.
Titolo: Re:Copia da memo in memo incompleta
Inserito da: xinyiman - Aprile 09, 2021, 08:19:24 am
Prova a segnalarlo qui: https://forum.lazarus.freepascal.org/