Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.




Deel:
Meldingen
Alles wissen

Lazarus - Hoe fix je een Database field dat als (memo) in een DBGrid verschijnt

2 Berichten
1 Gebruikers
0 Vind-ik-leuks
1,807 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2654
Topic starter  

Soms heb je een raar effect, waarbij een text veld van jouw database query als ftMemo blob, en in een DBGrid zien we dan "(memo)" i.p.v. de werkelijk tekst.
Knap lullig en het verbaast me dat zowel Delphi als Lazarus geen simpelere oplossing ingebakken hebben ...

Anyhoo .. hoe lost je dit probleem op?

Optie 1 (beste) - Aanpassen van de SQL Query

Deze optie is stukken makkelijker, maar werkt misschien niet met iedere database engine.
Met een type cast gaan we een "Memo Blob" een gewone string worden. 

Merk op : Dit kan een klein beetje anders zijn, afhankelijk van de gebruikte SQL Database. Het werkt met SQLite, MySQL, en voor zover ik weet ook met PostgreSQL.

Stel jouw query is:

SELECT
  "Filename", 
  "Date"
FROM
  "mytable";

En stel dat het veld "Filename" het probleem is dat als "(memo)" wordt weergegeven.

Met een simpele type cast (eventuele velden van de TQuery component verwijderen!) maken we de TEXT een VARCHAR als volgt:

SELECT
  CAST( "Filename" as VARCHAR) as "Filename", 
  "Date"
FROM
  "mytable";

Je zult nu de echte tekst zien en niet die maffe "(memo)".

Optie 2 - Met een OnGetText Event

Als eerste moeten we velden gaan toevoegen aan onze TQuery. Klik de TQuery met rechts aan en kies "Edit Fields".
In het opkomende venster klik je nu op de "+" knop om daarmee minstens het veld toe te voegen dat als "(memo)" wordt weergegeven.

Klik nu op het nieuwe veld, en je zult zien dat het een TMemoField is in de object inspector.

Klik de "Events" tab in de object inspector en dubbel klik de "OnGetText" event.

Voeg nu de volgende code toe in de procedure (uitgaande van: TQuery = qrySomeQuery, fieldname = "SomeField", wat een TMemoField maakt met de naam "qrySomeQuerySomeField"):

  aText := Sender.AsString;
  DisplayText:=true;

Dus we krijgen dan zoiets als dit, wat er voor zorgt dat (at runtime) we de echte tekst gaan zien i.p.v. "(memo)":

procedure TForm1.qrySomeQuerySomeFieldGetText(Sender: TField; var aText: string; DisplayText: Boolean);
begin
  aText := Sender.AsString;
  DisplayText:=true;
end; 

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2654
Topic starter  

Merk op:

casting naar varchar schijnt niet (meer) te werken.

Wat wel werkt is casting naar een CHAR.

Echter, met recente Lazarus Pascal versies heb je dit niet meer nodig als je het "GetText" event van een field gebruikt voor conversie naar een string.


   
BeantwoordenCiteren

Bevalt je wat je hier ziet, en wil je graag helpen? 

Uiteraard is de beste manier van helpen, door anderen hier te helpen met hun vragen. Maar je kunt ons ook op andere manieren helpen:

- Shop bijvoorbeeld bij Amazon, het kost je niks extra, maar het kan zijn dat wij een kleine commissie ontvangen,
- stuur me een koffie via PayPal ($5, $10, $20, or zelf kiezen),
- je kunt ook een Patreon worden,
- of BitCoin (BTC), of BitCoinCash (BCH) doneren.

Deel: