Accueil > FAQ | FAQ |
Concernant vos proposition de Q&R, nous vous invitons à nous les soumettre par les formulaires de contact en spécifiant la question et la réponse à publier.
Merci de ne pas confondre FAQ et Forum. La première étant un extrait du second. Préférez alors les forums pour poser les questions sans réponses.
Voici la liste des principales catégories et de leurs sous-catégories. Choisissez une catégorie pour voir les Q&R.
Ici, la liste des dernières Q&R publiées.
Demandé et répondu par R&B le 27-Sep-2004 12:14 (2766 Lectures)
Rebooter le projet en execution
Comment faire pour que l'application se relance ?
En effet, les modifications de la configuration par un panneau de configuration intégré doivent être prise en compte par le relancement de l'exe (lecture de la configuration dans initialisation du projet).
Pour ce faire c'est trés simple :
l'application doit être multi-instance (pas testé si non instance)
On lance une autre session via LanceAppli() en spécifiant le nom de l'exe courant disponible avec exeInfo(). Puis, on termine la session en cours avec FinProgramme().
Ainsi l'utilisateur se voit invité dans une autre session du même logiciel... avec les nouveau paramètres de configuration pris en compte.
En effet, les modifications de la configuration par un panneau de configuration intégré doivent être prise en compte par le relancement de l'exe (lecture de la configuration dans initialisation du projet).
Pour ce faire c'est trés simple :
l'application doit être multi-instance (pas testé si non instance)
On lance une autre session via LanceAppli() en spécifiant le nom de l'exe courant disponible avec exeInfo(). Puis, on termine la session en cours avec FinProgramme().
Ainsi l'utilisateur se voit invité dans une autre session du même logiciel... avec les nouveau paramètres de configuration pris en compte.
SI PAS LanceAppli(gProjetExe,exeActif,exeNonBloquant) ALORS
Erreur(ErreurInfo(errMessage))
SINON
FinProgramme()
FIN
Demandé et répondu par R&B le 27-Sep-2004 12:14 (3232 Lectures)
Conversion Décimal - Hexadécimal
Conversions par Michel Fages
Decimal en hexa
hex = NumToString(dec, 'x')
Hexa en décimal
dec = Val(hex, 16)
Demandé et répondu par R&B le 27-Sep-2004 12:14 (2902 Lectures)
Inactiver une touche clavier
Merci au post de Firetox qui permet de répondre à cette question récurente :
voici sonc un exemple de code pour inactiver la touche échap.
le principe et simple, on intercepte l'évènement correspondant à cette touche et on transforme le résultat obtenu pour qu'il ne soit pas interprété par l'application.
Pour les autres touches, il suffit de trouver les valeur windows de l'évènement correspondant. Notez la présence du fichier Windev7x/Personnel/Externe/KeyConst.WL qui peut être inclus à votre projet pas le comande Externe 'KeyConst.WL' en début de projet.
Un evenement et une procedure :
voici sonc un exemple de code pour inactiver la touche échap.
le principe et simple, on intercepte l'évènement correspondant à cette touche et on transforme le résultat obtenu pour qu'il ne soit pas interprété par l'application.
Pour les autres touches, il suffit de trouver les valeur windows de l'évènement correspondant. Notez la présence du fichier Windev7x/Personnel/Externe/KeyConst.WL qui peut être inclus à votre projet pas le comande Externe 'KeyConst.WL' en début de projet.
Un evenement et une procedure :
// ouverture de la fenetre
GLOBAL
WMKeydown est un entier long = 256
evenement('Annul_Echap','*.*',WMKeydown)
// procedure Annul_Echap
Procédure Annul_Echap()
si _eve.wparam = 27 alors
// ou si _eve.wparam = VK_ESCAPE alors
_eve.retour = 0
FIN
Demandé et répondu par R&B le 27-Sep-2004 12:14 (4499 Lectures)
Supprimer une ligne dans un fichier texte
Il est impossible d'éffectuer cette manipulation directement dans le fichier original. Reste que rien n'empèche de passer par un fichier temporaire.
Il suffit alors simplement de copier dans un fichier temporaire les parties à conserver du fichier d'origine et sauter les lignes à supprimer.
Faire suivre le procédé par un fRenomme() et le tour est joué.
Il suffit alors simplement de copier dans un fichier temporaire les parties à conserver du fichier d'origine et sauter les lignes à supprimer.
Faire suivre le procédé par un fRenomme() et le tour est joué.
Demandé et répondu par R&B le 27-Sep-2004 12:14 (3333 Lectures)
MonGroupe..Etat ne contient pas la valeur prévue
Attention :
Il est possible que la proriété ..Etat d'un groupe de champs ne corresponde pas à la dernière valeur qui lui a été fixée.
En effet, si vous affectez indépendament l'état de certains champs du groupe, la propriété du groupe peut se voir affectée sans que les autres champs se voient modifiées.
Cause :
Aide de la propriété ..Etat
Citation :
La modification de l'état de ce premier champs (selon l'ordre des tabstops) affecte la propriété ..etat du groupe sans que l'état des autres champs soient modifiés.
Une solution consiste alors simplement à ajouter un champs invisible au groupe : CHPGP_ et ensuite remplacer
par
pour être à coup sûr de tomber juste dans l'évaluation l'état du groupe.
Il est possible que la proriété ..Etat d'un groupe de champs ne corresponde pas à la dernière valeur qui lui a été fixée.
En effet, si vous affectez indépendament l'état de certains champs du groupe, la propriété du groupe peut se voir affectée sans que les autres champs se voient modifiées.
Cause :
Aide de la propriété ..Etat
Citation :
Etat d'un groupe de champs
Connaître l'état d'un groupe de champs : l'état renvoyé correspond à l'état du premier champ du groupe.
La modification de l'état de ce premier champs (selon l'ordre des tabstops) affecte la propriété ..etat du groupe sans que l'état des autres champs soient modifiés.
Une solution consiste alors simplement à ajouter un champs invisible au groupe : CHPGP_
si <NomDuGroupe>..etat=Actif alors
par
si CHPGP_<NomDuGroupe>..etat=Actif alors
pour être à coup sûr de tomber juste dans l'évaluation l'état du groupe.
Demandé et répondu par R&B le 27-Sep-2004 12:14 (2380 Lectures)
..visible avec une fenêtre comportant des plans
La propriété ..visible et la gestion des plans se recouvrent.
Ainsi monchamp..visible retourne faux même si le champs est visible quand le champs n'appartient pas au plan courant de la fenêtre.
La solution, pour les fenêtres qui comportent des plans
Ainsi monchamp..visible retourne faux même si le champs est visible quand le champs n'appartient pas au plan courant de la fenêtre.
La solution, pour les fenêtres qui comportent des plans
// le plan du champ devient le plan courant
Mafenêtre..plan=Monchamp..plan
// récupère la visibilité effective du champ
info(Monchamp..visible) // retourne alors vrai
Demandé et répondu par R&B le 27-Sep-2004 12:14 (2877 Lectures)
Colonnes de tables qui deviennent inexistantes en execution
L'utilisation de ConstuitTableFichier() pour alimenter une table à partir du résultat d'une requete doit être accompagnée de précaution.
Extrait de l'aide :
Citation :
Ainsi, après cette fonction, il ne faut utiliser plus que l'indirection et _COL1... pour manipuler les colonnes de votre table. Ne plus utiliser les noms des colonnes définies avec l'éditeur de fenêtre.
Extrait de l'aide :
Citation :
-Les colonnes de la table définies sous l'éditeur sont supprimées.
- Les modes de saisie définis sous l'éditeur pour la table sont conservés.
...
Les colonnes créées portent les noms "_COL1", "_COL2", "_COL3", etc. Ces colonnes sont accessibles par programmation via l'opérateur d'indirection { }.
Ainsi, après cette fonction, il ne faut utiliser plus que l'indirection et _COL1... pour manipuler les colonnes de votre table. Ne plus utiliser les noms des colonnes définies avec l'éditeur de fenêtre.
Demandé et répondu par R&B le 27-Sep-2004 12:14 (2532 Lectures)
Suprimer une sous chaine dans une chaine
La procédure suivante supprime la première occurrence d'une sous chaine dans une autre :
Exemple :
ChaineSupprime("111222333","222") => "111333"
PROCEDURE ChaineSupprime(ChaineInitiale,ChaineASupprimer)
pos est un entier
len est un entier=Taille(ChaineASupprimer)
c est une chaîne
pos=Position(ChaineInitiale,ChaineASupprimer)
SI pos<>0 ALORS
c=ExtraitChaîne(ChaineInitiale,1,ChaineASupprimer)
ChaineInitiale=c+ExtraitChaîne(ChaineInitiale,2,ChaineASupprimer)
FIN
Exemple :
ChaineSupprime("111222333","222") => "111333"
Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (2746 Lectures)
Copier Windows / Coller Windev (Fichiers uniquement)
Copier des Fichiers sous windows, pour les coller sous windev. (Récupération du chemin des fichiers contenus dans le presse papier)
Auteur : KPiTN
NbFIchierARecup est un entier
FileName est une chaîne
CFDrop est un entier
i est un entier
//acces au Press Papier
AppelDLL32("user32", "OpenClipboard",0)
//chercher si le press papier contient des fichiers
CFDrop=AppelDLL32("user32", "GetClipboardData",CF_HDROP)
//recuperer le nombre de fichier dans le press papier
NbFIchierARecup=AppelDLL32("SHELL32","DragQueryFile",CFDrop,-1,"",0)
POUR i=0 A NbFIchierARecup-1
FileName=Complète(FileName,350)
//récuperation du fichier
AppelDLL32("SHELL32","DragQueryFile",CFDrop,i,FileName,Taille(FileName))
Trace(FileName)
FileName=SansEspace(FileName) Trace(FileName)
FIN
//Fermeture du press papier
AppelDLL32("user32", "CloseClipboard")
Auteur : KPiTN
Demandé et répondu par R&B le 27-Sep-2004 12:14 (1220 Lectures)
Propriétés des éléments des fenêtres non ouvertes
Si les propriétés des éléments des fenêtres (champs...) sont disponibles, il n'en demeure qu'elles ne sont lisibles que si la fenêtre est ouverte car WinDev ne peut lire que les propriétés des éléments chargé en mémoires (APIs et poignées).
Une solution consiste simplement à ouvrir la fenêtre en mode 'caché'. C'est à dire hors écran.
Evidement une condition sera que cette fenêtre ne doit effectuer aucun traitement automatique avec interaction nécessaire en ouverture quand elle est dans ce mode d'ouverture. Il faudra alors désactiver ces traitements dans la phase d'initialisation de la fenêtre et des champs.
Une solution consiste simplement à ouvrir la fenêtre en mode 'caché'. C'est à dire hors écran.
Evidement une condition sera que cette fenêtre ne doit effectuer aucun traitement automatique avec interaction nécessaire en ouverture quand elle est dans ce mode d'ouverture. Il faudra alors désactiver ces traitements dans la phase d'initialisation de la fenêtre et des champs.
// Appel de la fenêtre 'cachée'
OuvreSoeur(nomfenetre,Vrai)
// init fenêtre ouverte hors ecran
PROCEDURE NomFenetre(pbModeCaché=Faux)
SI pbModeCaché ALORS FenEtat(nomfenêtre,HorsEcran)
// Evaluer pbModeCaché pour inactiver les traitements d'initialisation avec interaction
Demandé et répondu par Totof le 27-Sep-2004 12:14 (2679 Lectures)
Threads et multitâche
Bonjour tout le monde,
J'ai un message pour les utilisateurs de Threads.
Après avoir contacté le support technique de WD, j'ai appris
qu'il ne fallait JAMAIS UTILISER LA FONCTION MULTITACHE dans une procédure appelée par un Thread.
Avant je fesais :
Maintenant il faut faire :
Le gestionnaire des tâches indique que 100% des ressources processeur sont utilisées ... mais on m'a dit que ce n'était qu'un affichage windows et effectivement on peut continuer à travailler correctement.
Il ne faut pas utiliser multitâche dans les threads.
C'était l'info du jour.
A+
Tof
J'ai un message pour les utilisateurs de Threads.
Après avoir contacté le support technique de WD, j'ai appris
qu'il ne fallait JAMAIS UTILISER LA FONCTION MULTITACHE dans une procédure appelée par un Thread.
Avant je fesais :
Tantque pas ArretThead
multitache(-1)
Fin
Maintenant il faut faire :
Tantque pas ArretThread
Fin
Le gestionnaire des tâches indique que 100% des ressources processeur sont utilisées ... mais on m'a dit que ce n'était qu'un affichage windows et effectivement on peut continuer à travailler correctement.
Il ne faut pas utiliser multitâche dans les threads.
C'était l'info du jour.
A+
Tof
Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (3722 Lectures)
Copier Windev / Coller Windows (Fichiers uniquement)
Copier des Fichiers sous windev, pour les coller sous windows.
SI AppelDLL32("user32", "OpenClipboard",0) ALORS
AppelDLL32("user32", "EmptyClipboard" )
Data=""
//Récupération des chemins de fichiers dans une table
POUR i=1 A TableSelectOccurrence(TABLEEXEMPLE)
Data+=TABLEEXEMPLE.Chemin[TableSelect(TABLEEXEMPLE,i)] + Caract(0)
FIN
hGlobal=AppelDLL32("kernel32","GlobalAlloc",0x40,Dimension(df) + Taille(Data))
SI hGlobal ALORS
lpGlobal=AppelDLL32("kernel32","GlobalLock",hGlobal)
df:pFiles = Dimension(df)
AppelDLL32("kernel32","RtlMoveMemory",lpGlobal,&df,Dimension(df))
AppelDLL32("kernel32","RtlMoveMemory",(lpGlobal + Dimension(df)),Data,Taille(Data))
AppelDLL32("kernel32","GlobalUnlock",hGlobal)
// Copie les fichiers dans le press papier
SI AppelDLL32("user32", "SetClipboardData",CF_HDROP,hGlobal) ALORS
AppelDLL32("user32", "CloseClipboard")
FIN
FIN
FIN
Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (3107 Lectures)
[Outlook] Insertion de contact
Insertion de contact dans outlook à partir d'une BDD
Les différents élément du contact sont décrit dans le code
Les différents élément du contact sont décrit dans le code
// ----------------------------------------------------------------------------
//
// Insérer dans Les Contacts Outlook des données stockées dans une BDD (ou autre)
//
// ----------------------------------------------------------------------------
ReqFournisseur est une Source de Données
objApp est un objet OLE dynamique
objNS est un objet OLE dynamique
myFolder1 est un objet OLE dynamique
objFolder est un objet OLE dynamique
cit1 est un objet OLE dynamique
objApp=ObjetActif("OutLook.Application")
objNS=objApp>>GetNamespace("MAPI")
//Récuperer le dossier contact de votre choix
myFolder1=objNS>>PickFolder
//REQUETE CLASSIQUE WINDEV a remplacer par votre type de requete habituelle (HexecuteRequeteSQL ...)
ReqFournisseur=Req("Select * from fournisseurs",ReqFournisseur)
HLitPremier(ReqFournisseur)
TANTQUE PAS HEnDehors(ReqFournisseur)
cit1 = myFolder1>>Items>>Add(2)
//Nom
cit1>>FirstName =ReqFournisseur.Nom
//Prenom
cit1>>LastName =ReqFournisseur.prenom
// Société
cit1>>CompanyName=ReqFournisseur.RaisonSociale
// Premiere Adresse Email
cit1>>Email1Address = ReqFournisseur.Mail
// RUE DE L'ADRESSE
cit1>>BusinessAddressStreet=ReqFournisseur.AdressePaiement
//CODE POSTAL
cit1>>BusinessAddressPostalCode=ReqFournisseur.CPPaiement
// VILLE
cit1>>BusinessAddressState=ReqFournisseur.VillePaiement
//fax
cit1>>BusinessFaxNumber=ReqFournisseur.FaxPaiement
//Telephone
cit1>>BusinessTelephoneNumber=ReqFournisseur.TelPaiement
// web site
cit1>>WebPage=ReqFournisseur.Site
//classement du titre du contact ici(SOCIETE et FIRSTNAME)
SI cit1>>FirstName <>"" ALORS
cit1>>FileAs=cit1>>CompanyName + RC + "(" + cit1>>FirstName + ")"
SINON
cit1>>FileAs=cit1>>CompanyName
FIN
//CATEGORIE DU CONTACT
cit1>>Categories="Fournisseurs"
cit1>>SAVE
HLitSuivant(ReqFournisseur)
FIN
Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (4297 Lectures)
[OUTLOOK] Récupérer les infos des contacts Outlook
Récupérer des infos des contacts outlook
// ---------------------------------------
// Récupérer des infos des contacts outlook
// ----------------------------------------
ReqFournisseur est une Source de Données
objApp est un objet OLE dynamique
objNS est un objet OLE dynamique
myFolder1 est un objet OLE dynamique
objFolder est un objet OLE dynamique
cit1 est un objet OLE dynamique
NBContact est un entier
i est un entier=1
objApp=ObjetActif("OutLook.Application")
objNS=objApp>>GetNamespace("MAPI")
//Récuperer le dossier contact de votre choix
myFolder1=objNS>>PickFolder
// Nombre de contact dans le dossier selectionné
NBContact = myFolder1>>items>>count
TANTQUE i<NBContact
cit1=myFolder1>>items(i)
Trace(cit1>>FirstName + " - " + cit1>>CompanyName + " - " + cit1>>Email1Address + "- ETC ..." )
i++
FIN
// ----------------------------------------------
// Les infos à récupérer : (EXEMPLE)
// ----------------------------------------------
// //Nom
// cit1>>FirstName
// //Prenom
// //cit1>>LastName
// // Société
// cit1>>CompanyName
// // Premiere Adresse Email
// cit1>>Email1Address
// // RUE DE L'ADRESSE
// cit1>>BusinessAddressStreet
// //CODE POSTAL
// cit1>>BusinessAddressPostalCode
// // VILLE
// cit1>>BusinessAddressState
// //fax
// cit1>>BusinessFaxNumber
// //Telephone
// cit1>>BusinessTelephoneNumber
// // web site
// cit1>>WebPage=ReqFournisseur.Site
// //CATEGORIE
// cit1>>Categories
Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (3049 Lectures)
Recherche dans un Tableau (Suppression des lignes non désirées)
Procédure de recherche dans un tableau, on ne gardera dans ce tableau que les lignes qui nous intéressent
// ---------------------------------------------------------------------------------------
// PROCEDURE DE RECHERCHE DANS UN TABLEAU (EN GARDANT UNIQUEMENT LES ELEMENTS RECHERCHE)
// ---------------------------------------------------------------------------------------
// TableTaches.Taches <--- TableTaches est le nom de votre table , Taches est le nom de la colonne
// TxtRecherche <------ Champs texte qui contient le mot recherché
Pos est un entier
i est un entier
NumCherche est un entier
SupprIndice est un entier
TabRecherche est un tableau de 1000 entier
TableOccu est un entier
//MISE A JOUR DE VOTRE TABLE (DANS LAQUEL VOUS FEREZ LA RECHERCHE)
MajTableTaches
//RECHERCHE DANS LA TABLE DES LIGNES A SUPPRIMER
NumCherche=0
POUR i = 1 A TableTaches..Occurrence
Pos =Position(Majuscule(TableTaches.Taches[i]),Majuscule(TxtRecherche))
SI Pos> 0 ALORS
NumCherche++
TabRecherche[NumCherche]=i
FIN
FIN
TableOccu=TableTaches..Occurrence
SupprIndice=0
NumCherche=0
//SUPPRESSION DES LIGNES QUI NE VOUS INTERESSE PAS
POUR i=1 A TableOccu
SI i<>(TabRecherche[SupprIndice+1]) ALORS
TableSupprime(TableTaches,i-NumCherche)
NumCherche++
SINON
SupprIndice++
FIN
FIN
Demandé et répondu par Thernius le 27-Sep-2004 12:14 (5779 Lectures)
Comment convertir une durée en minute, seconde ?
Ce code a été fourni par DrCharly dans un post, merci à lui.
t1 est une Heure
t2 est une Heure
d1 est une Durée
t1 = HeureSys()
//Traitement
t2 = HeureSys()
d1 = t2 -t1
Info("Durée : " +
d1..Minute+"m"+d1..Seconde+"s"+d1..Milliseconde+"c")
Demandé et répondu par R&B le 27-Sep-2004 12:14 (2148 Lectures)
Cacher et récupérer des enregistrements.
Il peut s'avérer utile de 'cacher' des enregistrements pour effecteur un traitement et les récupérer ensuite.
- Remplir un tableau (dynamique) avec les n° des enregistrement à cacher.
- Utiliser hRaye() pour les enlever des parcours du traitement.
- Lancer le traitement, les enregistrement rayés ne sont plus lisible
- Récupérer les enregistrements par lecture et modification.
Hop : les enregistrements sont à nouveau là : magique !
NB :
- il faut veiller à ne pas quitter le traitement avant récupération des enregistrement ou bien alors se prémunir d'un mécanisme de sauvegarde/ restauration du fichier.
- Il faut aussi veiller à se prémunir d'un réindexation avec compactage du fichier pendant la durée du traitement sous peine de perdre les informations.
A utiliser de préférence avec des fichier temporaires donc.
- Remplir un tableau (dynamique) avec les n° des enregistrement à cacher.
ndim est un entier
tEnr est un tableau de 0 entiers sur 8 octets
ndim=Dimension(tEnr,Dimension(rEnr)+1)
tEnr[ndim]=HNumEnr(FICHIER)
- Utiliser hRaye() pour les enlever des parcours du traitement.
POUR i= 1 A ndim
HRaye(FICHIER,tEnr[i],hIgnoreIntégrité)
FIN
- Lancer le traitement, les enregistrement rayés ne sont plus lisible
- Récupérer les enregistrements par lecture et modification.
POUR i= 1 A ndim
HLit(FICHIER,tEnr[i])
HModifie(FICHIER,tEnr[i],hIgnoreIntégrité)
FIN
Hop : les enregistrements sont à nouveau là : magique !
NB :
- il faut veiller à ne pas quitter le traitement avant récupération des enregistrement ou bien alors se prémunir d'un mécanisme de sauvegarde/ restauration du fichier.
- Il faut aussi veiller à se prémunir d'un réindexation avec compactage du fichier pendant la durée du traitement sous peine de perdre les informations.
A utiliser de préférence avec des fichier temporaires donc.
Demandé et répondu par R&B le 27-Sep-2004 12:14 (3439 Lectures)
Afficher les composantes des clés composées
Les clés composées sont désormais disponibles sous forme de chaines via HconstruitValClé() qui simplifie grandement la gestion des clés composées.
Reste que les valeurs sont complétées par hValMin (ou hValMax).
hValMin est le caractère 0 de la table ascii, lequel correspond aussi en C/C++ (language dans lequel est créé WinDev) au caractère de fin de chaine.
Ainsi le code suivant
...ne retourne que la valeur de le première partie de la clé. info interprète le premier cacactère hValMin comme la fin de la chaine.
Pour résoudre ce problème, il faut simplement remplacer les caractère hValMin par des caractères affichables (un expace par exemple), ce qui donne :
Reste que les valeurs sont complétées par hValMin (ou hValMax).
hValMin est le caractère 0 de la table ascii, lequel correspond aussi en C/C++ (language dans lequel est créé WinDev) au caractère de fin de chaine.
Ainsi le code suivant
cCle est une chaine = HConstruiValCle(Fichier,Cle,val1,val2...)
info(cVal)
...ne retourne que la valeur de le première partie de la clé. info interprète le premier cacactère hValMin comme la fin de la chaine.
Pour résoudre ce problème, il faut simplement remplacer les caractère hValMin par des caractères affichables (un expace par exemple), ce qui donne :
cCle est une chaine = HConstruiValCle(Fichier,Cle,val1,val2...)
info(remplace(cVal,hvalmin,' ')
Demandé et répondu par R&B le 27-Sep-2004 12:14 (6109 Lectures)
SQL INSERT : connaître le dernier ID auto. (HF et MySQL)
FAQ aimablement soumise par KPiTN :
Récupérer le dernier identifiant inséré
BDD Hyperfile :
BDD Mysql :
Récupérer le dernier identifiant inséré
BDD Hyperfile :
ReqNav est une source de donnée
HExécuteRequêteSQL(ReqNav,'Insert Into Navires (LibNavire) Values (' + TxtNavire + ')')
DernierIdentifiant=ReqNav.idnavire
BDD Mysql :
ReqNav est une source de donnée
HExécuteRequêteSQL(ReqNav,'ConnectSQL',hRequêteSansCorrection,'insert into navires (libnavire) values ('' + TxtNavire+ '')')
HExécuteRequêteSQL(ReqNav,'ConnectSQL',hRequêteSansCorrection,Minuscule('SELECT LAST_INSERT_ID() as idnavire'))
HLitPremier(ReqNav)
DernierIdentifiant=ReqNav.idnavire
Demandé et répondu par Thernius le 27-Sep-2004 12:14 (3090 Lectures)
Pourquoi une concaténation dans une requête SQL ne fonctionne pas?
Voici le morceau de code qui ne fonctionne pas :
La solution est donnée par DrCharly, la voici :
Dans le code de la requête, il suffit de ne pas mettre de guillemets ("), mais tout simplement les remplacer par des quotes simples (').
...RIGHT(OPERATION.DATE,2)+"/"+MID(OPERATION.DATE,5,2)+"/"+MID(OPERATION.DATE,3,2) AS DATEAFF...
La solution est donnée par DrCharly, la voici :
...RIGHT(OPERATION.DATE,2)+'/'+MID(OPERATION.DATE,5,2)+'/'+MID(OPERATION.DATE,3,2) AS DATEAFF...
Dans le code de la requête, il suffit de ne pas mettre de guillemets ("), mais tout simplement les remplacer par des quotes simples (').