IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Bizarrerie TStream d'XML


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Bizarrerie TStream d'XML
    Bonsoir/jour ! J'ai un gros soucis incompréhensible pour moi au niveau de l'utilisation d'un TStream sur un fichier XML. Voilà la situation :

    Mon programme se compose d'une appli Client, avec un service datasnap client,
    et d'une appli serveur, avec un service datasnap serveur.

    Je vous explique jusqu'où ça allait très bien :

    1) Sur mon serveur, à partir d'un ClientDataSet (que j'affiche dans un DBGrid, mais peu importe) que je remplit à la main dans le code, je créée un fichier XML.

    2) Sur mon application client (après m'être connecté), un clic sur un bouton va lire grâce à un TStream le XML sur le serveur, et le ré-enregistre en local (sur le poste Client donc).

    Tout ça fonctionne, sauf que (partie programme) :

    Si je fais un XML de 10-15 lignes, tout est impeccable, mais avec un XML de 113 lignes par exemples, au moment d'utiliser mon "LoadFromStream" sur le client, j'ai une erreur :
    "ClientDataSet1:Fournisseur de données ou paquet de données manquant."
    (Et partie fichier) :

    Avec le XML de 10-15 lignes, le fichier XML d'arrivée est impeccable, comme sur le serv.
    Avec le XML de 113 lignes, au moment de l'ouvrir, InternetExplorer (pareil sous firefox et google chrome) refuse et indique :
    "La page XML ne peut pas être affichée
    Impossible d'afficher l'entrée XML en utilisant la feuille de style XSL. Corrigez l'erreur, puis cliquez sur le bouton Actualiser ou réessayez ultérieurement.


    --------------------------------------------------------------------------------

    Un caractère incorrect a été trouvé dans un contenu de texte. Erreur de traitement de la ressource file:///C:/GPAO/DIVERS/T...

    <ROW NUMERO_DOCUMENTATION="6" CATEGORIE="1" LIBELLE_APPLICATION="STOCK PLAQUES" NIVEAU_DOCUMENTATION="2" DESCRIPTIF_DOCUM..."
    (Sachant que cette 'ligne 6', si je la retire du code, ca va aller "planter" sur la ligne 21, puis 22, puis 43 ... Alors que les données entrées sont similairement les mêmes, avec de simples lettres ou chiffres...)
    Donc le problème ne viens réelement pas d'un caractère, car en interchangeant les lignes on obtient les mêmes erreurs

    De plus je peux très bien ouvrir le fichier XML (d'arrivée) sous WordPad, Word... Et cetera.


    J'ai pensé que c'était "peut-être" en rapport avec la taille du TStream, mais il est en int64 ... Donc j'me demande comment faire à ce moment là ...

    Si vous avez des questions, ou mieux, des réponses... Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    As-tu essayé un encodage en UTF8 par exemple ?
    tu es sûr que cela ne vient pas d'un caractère comme un accent sur la ligne ?
    ou un < ou > dans le texte d'un champ qui n'a pas été traduit en &lt; et &gt;

    Exemple de contenu vu par FireFox
    <ROW RowState="4" xF0="1" xF1="->1" xF2="TRUE" xF3="20120328T16:15:14565" xF4="Привет"/>
    Le même via NotePad
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <ROW RowState="4" xF0="1" xF1="-&gt;1" xF2="TRUE" xF3="20120328T16:15:14565" xF4="Привет"/>

    à l'écran ça donne ça


    Attention WordPad, Word ouvre le XML comme un vulgaire fichier Texte !
    Il faut se fichier à IE ou FireFox qui va vérifier la cohérence structurel du fichier !

    J'ai déjà manipulé des XML issu de TClientDataSet de plusieurs milliers de ligne, certains pouvant atteindre 1 Mo de données !

    tu écrit bien l'ensemble du Stream ?
    Comme est faite la lecture ? un Simple LoadFromStream ?
    Après le Load à tu peux à remetre Position à zéro ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Salut, merci de ton intérêt, je ne connais pas du tout l'UTF8 (je suis extrêmement débutant), et oui je suis QUASIMENT sur que cela ne vient pas d'un accent.

    Je vais mettre un peu de code pour éclaircir l'idée que vous pouvez avoir quand même : voici les FieldsDef :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    WITH ClientDataSetServeur DO
    BEGIN
    _Close;
    _FieldDefs.Clear;
    _WITH FieldDefs DO
    _BEGIN
    __Add('NUMERO_DOCUMENTATION', ftSmallint, 0);
    __Add('CATEGORIE', ftSmallint, 0);
    __Add('LIBELLE_APPLICATION', ftString, 30);
    __Add('NIVEAU_DOCUMENTATION', ftSmallint, 0);
    __Add('DESCRIPTIF_DOCUMENTATION', ftString, 50);
    __Add('NOM_DOCUMENTATION', ftString, 60);
    __Add('EXT_DOCUMENTATION', ftString, 5);
    __Add('REPERTOIRE_APPLICATION', ftString, 80);
    __Add('NOM_PROGRAMME', ftString, 30);
    __Add('NUMERO_VERSION', ftString, 10);
    _END; //WITH FieldDefs [/quote] 
     
    Et voici un exemple de ligne sur laquelle ça fonctionne (On voit bien que mêmes avec des accents/apostrophes... Ca passe ... ):
     
    [quote]      CreateDataSet;
          AppendRecord([1, 1, 'STOCK PLAQUES', '1', 'Fonctionnement du module plaque', 'ST_PLAQ', 'PDF', 'ST_PLAQ', '', '5.1']);
          AppendRecord([2, 1, 'STOCK PLAQUES', '2', 'Correction des stocks de plaques', 'COR_PLAQ', 'PDF', 'ST_PLAQ', 'COR_PLAQ', '5.1']);
          AppendRecord([3, 1, 'STOCK PLAQUES', '2', 'Gestion des besoins en plaques', 'OFPLAQ', 'PDF', 'ST_PLAQ', 'OFPLAQ', '5.1']);
          AppendRecord([4, 1, 'STOCK PLAQUES', '2', 'Commandes de plaques', 'COMMANDE_PLAQUE', 'PDF', 'ST_PLAQ', 'COMMANDE_PLAQUE', '5.1']);
          AppendRecord([5, 1, 'STOCK PLAQUES', '2', 'Configuration du stock plaques', 'P_PLAQUE', 'PDF', 'ST_PLAQ', 'P_PLAQUE', '5.1']);
          AppendRecord([66, 6, 'ADMINISTRATION', '2', 'Paramétrage global', 'PARAMINI', 'PDF', 'ADMINIST', 'PARAMINI', '5.1']);
          AppendRecord([94, 1, 'STOCK PAPIERS', '2', 'Commandes d''impressions papiers', 'COMMANDE_IMP_BOB', 'PDF', 'ST_PAPIER', 'COMMANDE_IMP_BOB', '5.1']);
    Et une ligne ou ça "bloque" (Lignes bidons ...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AppendRecord([6, 1, 'STOCK PLAQUES', '2', 'Inventaire du stock de plaques', 'INVENTAIRE_PLAQUE', 'PDF', 'ST_PLAQ', 'INVENTAIRE_PLAQUE', '5.1']);
    AppendRecord([22, 2, 'FACTURE', '2', 'Facturation des clients', 'FACTURES', 'PDF', 'FACTURE', 'FACTURES', '5.1']);

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Attention WordPad, Word ouvre le XML comme un vulgaire fichier Texte !
    Il faut se fichier à IE ou FireFox qui va vérifier la cohérence structurel du fichier !
    Oui oui je sais, je précisais juste au cas où, que le fichier était pas "illisible".

    Citation Envoyé par ShaiLeTroll Voir le message
    J'ai déjà manipulé des XML issu de TClientDataSet de plusieurs milliers de ligne, certains pouvant atteindre 1 Mo de données !
    Donc mon problème ne vient pas de la taille de mon TStream ...

    Citation Envoyé par ShaiLeTroll Voir le message
    tu écrit bien l'ensemble du Stream ?
    Comme est faite la lecture ? un Simple LoadFromStream ?
    Après le Load à tu peux à remettre Position à zéro?
    Comment vérifier que j'écrit bien l'ensemble ? (Plus tard dans mon projet je contais faire les vérifications avec un codage en MD5, mais j'ai pas plus regardé que ça, et je sais pas si c'est possible sur du TStream en plus ...)

    La lecture est faite ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    procedure TClientForm.Transfert_XMLClick(Sender: TObject);
    var
      functionDLFile : TMyClassClient;
      nom_fichier_XML : String;
      XML_stream:TStream;
    begin
      nom_fichier_XML:='Test_reussi.XML';
      functionDLFile:=TMyClassClient.Create(SQLConnection1.DBXConnection);
      TRY
        XML_stream:=functionDLFile.DownloadFile('Premier_Test.XML');
     
        ClientDataSetClient.LoadFromStream(XML_stream);
        ClientDataSetClient.SaveToFile(nom_fichier_XML);
      FINALLY
        functionDLFile.Free;
      END;
     
    end;
    (Et avec un "petit" fichier XML, tout fonctionne..Je récupère bien le fichier, etc,c'est seulement avec beaucoup de ligne dans le XML/CDS que ça merdouille)

    Après le load je fais rien pour l'instant (à pars le "SaveFile")... Mais j'ai un "clear" avant la lecture, donc je ne sais pas...

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Dans DataSnap, Il y a une option de limitation de trame ? à 32 ou 64Ko ?
    Faut regarder tes options côté serveur à ce sujet, la propriété BufferKBSize du TDSTCPServerTransport

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Ok j'ai trouvé autre chose ...

    Même pas besoin de regarder au niveau du transfert, le fichier XML est illisible dès l'instant ou il est créé, sur le serveur (donc le transfert, au final, se passe bien, je récupère la même chose)

    Donc le problème actuel est que si je créée, avec un ClientDataSet, un XML de quelques lignes, tout va, si le fichier est conséquent, rien va ...

    Et bien sur je n'ai aucune idée de pourquoi ...

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Au lieu de mettre un simple "UP", fournir un code complet ou un fichier XML complet aurait été plus utile pour tenter de reproduire le bug
    Tu n'as pas précisé la version de Delphi !
    Tu n'as pas précisé si plusieurs versions cohabitent, la MidasDLL étant enregistré comme ActiveX, cela peut réserver des surprises aussi !

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    C'est vrai je n'ai pas réfléchis

    La version est Delphi XE2 Version 16.0.4358.45540
    Mises à jours : Update 3 et Help Update 3
    Windows Seven version 6.1 (SP1)

    Le problème c'est que je ne peux pas mettre tout mon code, c'est de l'ordre du privé (Si ça tenais qu'à moi je m'en ficherais royalement de le partager)

    Je peux t'envoyer le fichier XML si tu veux, mais je ne peux pas le publier içi ...
    (Pour ça que je ne mettais que quelques lignes (et encore, modifiées !) ).

    Je vous ai déjà donné ma fonction qui "créé le XML" (qui remplit le CDS)

    J'ai testé autrement, c'est à dire en chargeant le CDS directement avec le XML (Le bon XML, celui qui fonctionne, de base) avec cette fonction toute bête :

    WITH ClientDataSetServeur DO
    BEGIN
    Close;
    FieldDefs.Clear;
    LoadFromFile('Documentation.XML');
    Open;
    END;
    (Après ceci l'affichage se fait parfaitement dans une TDBGrid branchée sur le CDS)

    J'appelle ensuite cette fonction :

    procedure TForm1.Button_SaveClick(Sender: TObject);
    begin
    ClientDataSetServeur.MergeChangeLog; (Ce n'est pas cette ligne qui fait l'erreur )
    ClientDataSetServeur.SaveToFile('Premier_test.XML');
    end;
    Donc en théorie j'ai juste chargé un CDS avec un XML, puis sauvegardé dans un nouveau fichier (Il devraient être identique non ? C'est ça que je pige pas)

    Mais non, toujours la même erreur en ouvrant le fichier "obtenu" (Alors que le fichier de base s'ouvre très bien) :

    La page XML ne peut pas être affichée
    Impossible d'afficher l'entrée XML en utilisant la feuille de style XSL. Corrigez l'erreur, puis cliquez sur le bouton Actualiser ou réessayez ultérieurement.


    --------------------------------------------------------------------------------

    Un caractère incorrect a été trouvé dans un contenu de texte. Erreur de traitement de la ressource file:///C:/GPAO/DIVERS/T...

    <ROW NUMERO_DOCUMENTATION="6" CATEGORIE="1" LIBELLE_APPLICATION="STOCK PLAQUES" NIVEAU_DOCUMENTATION="2" DESCRIPTIF_DOCUM...
    Petit constat :
    Le XML de base fait 33Ko
    Celui "d'arrivée" fait 32Ko


    Je me demande si le problème ne vient pas du "SaveToFile" avec un XML ... ?

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Tu peux mettre ChangeLog := False, les modifications via DBGrid seront immédiates et donc MergeChangeLog devient inutile, mais tu sembles avoir déjà vu ça

    tu as testé dans SaveToFile dfBinary, dfXML et dfXMLUTF8.

    C++Builder 2007 (mais mon MidasDLL doit être celui de XE2 Up3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    ClientDataSetBasics->Close();
    ClientDataSetBasics->FieldDefs->Clear();
    ClientDataSetBasics->FieldDefs->Add("NUMERO_DOCUMENTATION", ftSmallint, 0);
    ClientDataSetBasics->FieldDefs->Add("CATEGORIE", ftSmallint, 0);
    ClientDataSetBasics->FieldDefs->Add("LIBELLE_APPLICATION", ftString, 30);
    ClientDataSetBasics->FieldDefs->Add("NIVEAU_DOCUMENTATION", ftSmallint, 0);
    ClientDataSetBasics->FieldDefs->Add("DESCRIPTIF_DOCUMENTATION", ftString, 50);
    ClientDataSetBasics->FieldDefs->Add("NOM_DOCUMENTATION", ftString, 60);
    ClientDataSetBasics->FieldDefs->Add("EXT_DOCUMENTATION", ftString, 5);
    ClientDataSetBasics->FieldDefs->Add("REPERTOIRE_APPLICATION", ftString, 80);
    ClientDataSetBasics->FieldDefs->Add("NOM_PROGRAMME", ftString, 30);
    ClientDataSetBasics->FieldDefs->Add("NUMERO_VERSION", ftString, 10);
     
     
    ClientDataSetBasics->CreateDataSet();
    ClientDataSetBasics->AppendRecord(ARRAYOFCONST((1, 1, "STOCK PLAQUES", "1", "Fonctionnement du module plaque", "ST_PLAQ", "PDF", "ST_PLAQ", "", "5.1")));
    ClientDataSetBasics->AppendRecord(ARRAYOFCONST((2, 1, "STOCK PLAQUES", "2", "Correction des stocks de plaques", "COR_PLAQ", "PDF", "ST_PLAQ", "COR_PLAQ", "5.1")));
    ClientDataSetBasics->AppendRecord(ARRAYOFCONST((3, 1, "STOCK PLAQUES", "2", "Gestion des besoins en plaques", "OFPLAQ", "PDF", "ST_PLAQ", "OFPLAQ", "5.1")));
    ClientDataSetBasics->AppendRecord(ARRAYOFCONST((4, 1, "STOCK PLAQUES", "2", "Commandes de plaques", "COMMANDE_PLAQUE", "PDF", "ST_PLAQ", "COMMANDE_PLAQUE", "5.1")));
    ClientDataSetBasics->AppendRecord(ARRAYOFCONST((5, 1, "STOCK PLAQUES", "2", "Configuration du stock plaques", "P_PLAQUE", "PDF", "ST_PLAQ", "P_PLAQUE", "5.1")));
    ClientDataSetBasics->AppendRecord(ARRAYOFCONST((66, 6, "ADMINISTRATION", "2", "Paramétrage global", "PARAMINI", "PDF", "ADMINIST", "PARAMINI", "5.1")));
    ClientDataSetBasics->AppendRecord(ARRAYOFCONST((94, 1, "STOCK PAPIERS", "2", "Commandes d'impressions papiers", "COMMANDE_IMP_BOB", "PDF", "ST_PAPIER", "COMMANDE_IMP_BOB", "5.1")));
    ClientDataSetBasics->AppendRecord(ARRAYOFCONST((6, 1, "STOCK PLAQUES", "2", "Inventaire du stock de plaques", "INVENTAIRE_PLAQUE", "PDF", "ST_PLAQ", "INVENTAIRE_PLAQUE", "5.1")));
    ClientDataSetBasics->AppendRecord(ARRAYOFCONST((22, 2, "FACTURE", "2", "Facturation des clients", "FACTURES", "PDF", "FACTURE", "FACTURES", "5.1")));
     
      ClientDataSetBasics->SaveToFile(toto, dfXMLUTF8);
      ClientDataSetBasics->Close();
    é dans 'Paramétrage global' pose évidement un problème !
    SaveToFile simple => "Erreur d'analyse XML"
    SaveToFile(dfXML) => "Erreur d'analyse XML"
    SaveToFile(dfXMLUTF8) => OK

    Ce n'est pas comme si je l'avais déjà dit dans ma toute première réponse à la première ligne

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    En reprennant l'erreur proposée par InternetExplorer (Et chrome et firefox)
    L'erreur est la suivante (IE) :

    Détails de l’erreur de la page Web

    Agent utilisateur : Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
    Horodateur : Fri, 6 Apr 2012 10:22:34 UTC


    Message*: Un caractère incorrect a été trouvé dans un contenu de texte.

    Ligne*: 1
    Caractère*: 2652
    Code*: 0
    URI*: file:///C:/GPAO/DIVERS/Théo/SERVER_REST_5/Win32/Debug/Test_reussi.XML
    Le caractère 2652 est un "A" on ne peut plus classique

    Pour ce qui est de ta réponse :

    "MidasDLL" je ne sais même pas ce que c'est comme librairie pour tout te dire, ni ce que ça peut causer comme problème en fonctions des versions de Delphi ...

    ClientDataSetBasics->SaveToFile(toto, dfXMLUTF8);
    Testé, même problème toujours :/

    ClientDataSetBasics->AppendRecord(ARRAYOFCONST((1, 1, "STOCK PLAQUES", "1", "Fonctio...
    Le ArrayOfConst n'existe pas en Delphi, il est implicite je crois.

    Du coup j'suis toujours aussi paumé

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Midas c'est la DLL qui implémente le TClientDataSet, déjà installé sur un poste de développeur équipé d'un Delphi, c'est une brique de DataSnap
    En Delphi, on l'inclus via le uses MidasLib en plus de DBClient

  12. #12
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Ok, à force de bidouiller et inter-changer quelques lignes de codes, sans m'en rendre compte, ça s'est mis à fonctionner ....

    Par contre il reste un phénomène à noter

    Avec cette méthode ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button_Create_XMLClick(Sender: TObject);
    begin
     
    WITH ClientDataSetServeur DO
        BEGIN
          <div style="margin-left:40px">Close;
          FieldDefs.Clear;
          LoadFromFile('Documentation.XML');
          CreateDataSet();
          LogChanges:=FALSE;
          Open;</div>    END;
     
    end;
    Mais comme ça, ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    WITH ClientDataSetServeur DO
        BEGIN
          <div style="margin-left:40px">Close;
          FieldDefs.Clear;
          WITH FieldDefs DO
            BEGIN
              <div style="margin-left:40px">Add('NUMERO_DOCUMENTATION', ftSmallint, 0);
              Add('CATEGORIE', ftSmallint, 0);
              Add('LIBELLE_APPLICATION', ftString, 30);
              Add('NIVEAU_DOCUMENTATION', ftSmallint, 0);
              Add('DESCRIPTIF_DOCUMENTATION', ftString, 50);
              Add('NOM_DOCUMENTATION', ftString, 60);
              Add('EXT_DOCUMENTATION', ftString, 5);
              Add('REPERTOIRE_APPLICATION', ftString, 80);
              Add('NOM_PROGRAMME', ftString, 30);
              Add('NUMERO_VERSION', ftString, 10);</div>        END; //WITH FieldDefs 
     
          CreateDataSet();
          LogChanges:=FALSE;
    AppendRecord([1, 1, 'STOCK PLAQUES', '1', 'Fonctionnement du module plaque'   (Etcetera, bref en refaisant le même XML que 'Documentation.XML')
          Open;</div>    END; // with ClientDataset1
    La différence en gros c'est le CreateDataSet() entre les FieldsDef et les AppendRecords

    Je ne comprend pas encore pourquoi ... Je continue de creuser ...

    EDIT : J'ai dis sans réfléchir que le problème était résolu, au temps pour moi :
    Le problème est juste modifié, comme je l'ai dis, avec la "1ère méthode", ça ne fonctionne pas.

    C'est pourtant avec cette méthode que je contait manipuler le fichier XML sur mon application Client... (Problème du début en quelque sortes ^^, mais on a avancé ! \o/ )

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    il ne faut pas mélanger LoadFromFile et CreateDataSet, c'est soit l'un soit l'autre
    Après un CreateDataSet, le Open est inutile car déjà ouvert

    Sinon, ton fichier XML est taggé "encoding="ISO-8859-1", je ne savais pas qu'il l'ajoutait, ma version ne le fait pas, soit UTF8 soit rien !
    Le fichier est même très propre avec des retours charriots, idem, ma version ne fait pas cela, ton hébergement a-t-il altéré le fichier ?

    Si je retire l'encoding, j'obtiens une erreur "Gestion des papiers imprimés" puis "Gestion des commandes d'articles négoce en multi-c" ...

    Je reste convaincu que c'est lié aux accents !

  14. #14
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Salut !
    Désolé pour mon absence j'étais pas au boulot la semaine dernière.

    J'ai trouvé une page qui m'intrigue un peu, car elle liste les normes ISO, mais le ISO 8859-1 n'y est pas ... (il y a le , ISO 646) :

    http://docwiki.embarcadero.com/VCL/f...MLEncodingType

    Et je ne pige vraiment plus là. ><

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    "ISO-8859-1" c'est Latin1 que l'on peut assimiler à du Windows1252 (sauf le œ)
    On peut penser qu'il passe en xetUTF_8Like (ASCII)

    Sinon, c'est le composant IXMLDocument que tu regardes, une encapsulation Windows, et je peux te dire qu'il gère aussi bien le "ISO-8859-1", "Windows1252" et "UTF8".
    Pour le TClientDataSet, j'ignore l'API XML utilisé, j'ignore si dans la DLL Midas, je ne pense qu'ils utilisent un IXMLDocument, le chargement aurait plus de problème a grand volume !

    Déjà que cela ne fonctionne pas avec un SaveToFile en dfXMLUTF8, pour moi, il y a un problème, il ajoute en haut du fichier <... encoding="UTF8"> du coup tes caractères 127+ sont converti en deux octets
    Cela DOIT fonctionner avec dfXMLUTF8 !

    côté serveur, en reprenant ton premier code, celui qui génère le TOUT PREMIER XML !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    WITH ClientDataSetServeur DO
    BEGIN
    _Close;
    _FieldDefs.Clear;
    _WITH FieldDefs DO
    _BEGIN
    __Add('NUMERO_DOCUMENTATION', ftSmallint, 0);
    __Add('CATEGORIE', ftSmallint, 0);
    ...
    _END; //WITH FieldDefs [/quote] 
     
      CreateDataSet;
          AppendRecord([1, 1, 'STOCK PLAQUES', '1', 'Fonctionnement du module plaque', 'ST_PLAQ', 'PDF', 'ST_PLAQ', '', '5.1']);
     
      SaveToFile('Doc.XML', dfXMLUTF8);
    END;
    Tout fichier enregistré par un ancien code avec un SaveToFile sans précision ne pourra surement jamais être ré-ouvert si il ne précise pas l'encoding dans l'entête XML
    Comme je te le faisais remarquer, ma version n'ajoute pas d'encoding avec un SaveToFile simple ! c'est pour moi, un gros défaut !


    Tente un Update 4 !

  16. #16
    Membre à l'essai
    Homme Profil pro
    Développeur ERP en Delphi
    Inscrit en
    Septembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ERP en Delphi
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Salut !
    Bon finalement j'ai abandonné ...

    Ca fonctionne avec l'encodage en UTF8, mais toujours pas avec l'ISO encoding, sans savoir pourquoi ...

    (Je rappelle que le fichier XML de base était encodé ISO, donc les accents passaient bien, etc ...)

    Je laisse le sujet ouvert !

Discussions similaires

  1. Sauver un TStream dans un document XML
    Par srvremi dans le forum Composants VCL
    Réponses: 4
    Dernier message: 07/10/2004, 13h17
  2. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 15h29
  3. delphi XML / HTML caractéres speciaux !
    Par adem dans le forum EDI
    Réponses: 2
    Dernier message: 29/08/2002, 17h48
  4. Débutant XML
    Par viny dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 25/07/2002, 12h07
  5. Pas de casse dans les XML
    Par :GREG: dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo