[Delphi] Een TDataSet maken van Data uit TIdHTTP.Post

Pagina: 1
Acties:

  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
Hallo!

Ik ben een groupware app aan het schrijven in delphi, en nu heb ik op een server (die niet van mij is) een mysql-database draaien die alleen van localhost mag worden benaderd. Nu zijn er een aantal mensen die gegevens uit die database moeten kunnen gebruiken, en muteren. De enige manier waarop ik bij die database kan is via PHP.

Wat ik nu gedaan heb is een PHP pagina op verzoek een bepaalde serie data uit te laten poepen, die vervolgens via een TIdHTTP.Post door een TStrings.CommaText wordt geparsed, en uitgelezen. De inhoud van die TStrings wordt dan in een Record gegooid waarvan er een global array bestaat, en die hang ik vervolgens met een pointer aan de data van een TTreeNode. Klinkt ingewikkeld he! En dat is nou juist het punt.

Nu vroeg ik me af of er niet een of andere manier is om een dergelijke app data-aware te maken! Dat scheelt me namelijk een hoop gerommel met componenten. Als ik nou een PHP-pagina maak die de database voor me uitleest, input en updatet, dan zou het qua mogelijkheden moeten kunnen.

Ik heb alleen geen flauw idee hoe ik een dataset moet maken van zoiets. Ik heb de helpfiles al doorgespit, maar ik kan zo gauw niks vinden. Kan je het dan redden met de standaardcompo's van Delphi 2005, of kan je zelf een componentje downloaden die je aan een TDataSource kan hangen... Je zou toch een soort dataset moeten kunnen maken die met jouw eigen protocol met een HTTP-URL communiceert?!?

Hoe pak je zoiets aan?

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 18-05 23:27

Delphi32

Heading for the gates of Eden

Een TDataSet descendant maken zou op zich niet al te moeilijk moeten zijn - heb hier een boek (Delphi 4 Developer's Guide) waarin uitgelegd staat hoe het moet. Iets van 23 abstract virtual methods overriden en je bent er :) Op het net vast wel meer over te vinden.
Iets anders is natuurlijk hoe je je data ophaalt en verwerkt. Ik gok dat je de procedure InternalOpen zal willen gebruiken voor dit probleem. Daarin haal je dan de data op vanaf je server (mbv je PHP-script) en voilà, alles in memory.
Voor het bewerken van de gegevens zal je de InternalPost moeten gaan implementeren. Ook dat is dan weer een kwestie van je webserver-script aanroepen met de juiste parameters.

Klinkt uitermate boeiend! Ik ben alleen bang dat je PHP-kant en je TDataSet-kant behoorlijk sterk aan elkaar gekoppeld worden. Weet je zeker dat het gebruik van data-aware controls de inspanning van het schrijven van een TDataSet, die zeer strak samenwerkt met je PHP-kant, rechtvaardigt?

  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
Wat het makkelijkst is, is gewoon dat de communicatie hetzelfde blijft. Gewoon een TDataset die 1 string heeft, en die ene string is de complete tabel. Opmaak moet redelijk makkelijk leesbaar zijn voor een PHP-script. Als de database dan verandert, kan je 'm simpel updaten door die string te posten naar de PHP-pagina, en als je 'm wil inlezen vraag je de string gewoon op.

Waar voor mij het probleem dus ligt, is: hoe kom je van een string (of van een TStrings) naar een TDataSet...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nog makkelijker dan een eigen TDataSet afgeleide maken is, denk ik, een in memory TDataSet gebruiken. Zoals bijvoorbeeld TClientDataSet. Je kan de kolommen aanmaken die je wilt en het vullen met data die jij wilt.

We adore chaos because we like to restore order - M.C. Escher


  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
Dat klinkt inderdaad wel interessant. Kan je die ook makkelijk weer uitlezen en posten?

Verwijderd

pelleke schreef op zaterdag 25 december 2004 @ 00:35:
Ik heb alleen geen flauw idee hoe ik een dataset moet maken van zoiets. Ik heb de helpfiles al doorgespit, maar ik kan zo gauw niks vinden. Kan je het dan redden met de standaardcompo's van Delphi 2005, of kan je zelf een componentje downloaden die je aan een TDataSource kan hangen... Je zou toch een soort dataset moeten kunnen maken die met jouw eigen protocol met een HTTP-URL communiceert?!?

Hoe pak je zoiets aan?
Kun je niet een soort van PHP webservice maken?
http://webservices.xml.com/pub/a/ws/2004/03/24/phpws.html

Volgens mij heeft Delphi wel e.o.a. XML dataset ofzo (in ieder geval wel met Delphi 7).

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

pelleke schreef op zaterdag 25 december 2004 @ 13:05:
Dat klinkt inderdaad wel interessant. Kan je die ook makkelijk weer uitlezen en posten?
Uitlezen gaat natuurlijk precies hetzelfde als je met elke TDataSet gewend was. Posten ook, maar je posts ze natuurlijk alleen in de memory dataset. Als je ze ook via je php/xml weer in je database wilt hebben moet je daar zelf voor zorgen.
Verwijderd schreef op zondag 26 december 2004 @ 03:38:
[...]

Kun je niet een soort van PHP webservice maken?
http://webservices.xml.com/pub/a/ws/2004/03/24/phpws.html

Volgens mij heeft Delphi wel e.o.a. XML dataset ofzo (in ieder geval wel met Delphi 7).
Dat is ook een idee, is eigenlijk wat ie al van plan was, alleen heet het geen SOAP. Delphi heeft ook een XML naar TDataSet mapper.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Waarom maak je geen client-server app, en installeer je de MYSQL ODBC drivers? Dan kun je gewoon vanuit delphi met mysql werken? Via PHP vind ik een beetje een smerige omweg eigenlijk..

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Daarom:
pelleke schreef op zaterdag 25 december 2004 @ 00:35:
Ik ben een groupware app aan het schrijven in delphi, en nu heb ik op een server (die niet van mij is) een mysql-database draaien die alleen van localhost mag worden benaderd. Nu zijn er een aantal mensen die gegevens uit die database moeten kunnen gebruiken, en muteren.

We adore chaos because we like to restore order - M.C. Escher


  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
Ik krijg toch niet helemaal voor elkaar wat ik wil; ik wil namelijk de datastructuur erbij hebben. Een XML dataset heeft Delphi vanaf versie 3: de TClientDataSet, maar die kan niet zijn structuur uit een XML-file lezen.

Hoe transformeer je een data-tabel (compleet met datastructuur erbij) naar iets dat je kan posten naar een PHP-pagina en vice versa? Zo ingewikkeld kan dat toch niet zijn?

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:34

alienfruit

the alien you never expected

// set xml data
TCustomClientDataSet.SetData( StringToVariantArray( Value ) );

zie ook: XMLData-property

[ Voor 62% gewijzigd door alienfruit op 02-01-2005 17:57 ]

Pagina: 1