PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Comment executer une requete SQL sous une connection par Socket ?
Comment executer une requete SQL sous une connection par Socket ?
Débuté par b.cloart, 23 mai 2013 15:53 - 8 réponses
Posté le 23 mai 2013 - 15:53
Bonjour,

Je suis entrain de crée une application qui va executer des requete SQL, je me connect a mon serveur par :

SI SocketConnecte("server", 1115,"xxx.xxx.xxx.xxx") = Faux ALORS
Erreur("erreur de connexion " + ErreurInfo(errMessage))
SINON
Info("Socket Connecter")
FIN


une fois ma connection etabli je ne vois pas comment executer une requete sql sur une base.
Membre enregistré
948 messages
Posté le 23 mai 2013 - 16:12
Bonjour,
Je ne crois pas que cela possible.
Quelle base utilisez-vous ?
Posté le 23 mai 2013 - 17:33
Je travail sur CEGID avec une base FireBird 1.5, CEGID utilise un service pour executer ses requete.
Le service est installer sur le serveur. Les client envoi les requete SQL au service et le service envoi les requete a la Base.
Car aucun des clients n'a acces a la base de donnée.


ca a l'air possible en regardant c'est messagage :
http://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/72819-thread-sqlexec-75029/read.awp…

ci ce n'est pas comme ca que les poste Client communique avec la Base de donnée, je ne vois pas comment...
Membre enregistré
948 messages
Posté le 23 mai 2013 - 18:43
Bonjour,
Je ne connais pas cette base ni CEGID, mais avec le driver odbc http://www.firebirdsql.org/en/odbc-driver/ cela surement possible. Condition : avoir un couple User/Password de valide.
Il est possible que CEGID utilise un module propriétaire, installé sur le serveur qui sert de passerelle entre le client et la base auquel cas cela ne va pas vous simplifier la vie...
C'est ce procedé que j'utilise pour faire des requêtes sql à distance sur un serveur PostgreSQL à partir d'un mobile
Membre enregistré
89 messages
Posté le 24 mai 2013 - 16:40
Bonjour,
j'utilise aussi des socket pour faire executer des requetes SQL à un service maison quand je suis en accés distant.
En fait tout dépend du service installé sur le serveur, as tu une documentation sur les commandes à faire passer au service ? (la socket n'étant qu'un moyen de communication comme un autre, je le fait aussi via le protocole Http et un script php...)
On utilise la commande SocketEcrit() avec en paramètre la requete SQL : SocketEcrit("server","select * from maTable"
mais voilà, il doit sans doute y avoir des commandes a passer devant la requête pour parler avec le service et lui dire qu'on veut executer cette requête : SocketEcrit("server","SQL::select * from maTable")
Pour récupérer le résultat c'est avec SocketLit() : resultat est chaine = SocketLit("server")
Enfin tout ca est théorique, ca dépend des spécificités du service.
Regarde aussi du coté de SocketChangeModeTransmission(), car tu utilises une socket non Windev (les commandes de socket Windev modifie les trames).
Membre enregistré
27 messages
Posté le 24 mai 2013 - 23:24
Bonsoir,

j'ai écrite une appli qui effectue entre autre ce genre d'action, le principe est "simple", tu dois écrire une appli "Cliente" qui s'exécutera sur chacun de tes postes clients et une appli "serveur" qui sera côte à côte avec ton appli métier CEGID.

La gestion des sockets ne te permettra en fait que d'envoyer les requêtes (au format chaine) vers ton appli "Serveur" qui elle se chargera de leur exécution, par la création d'un thread différent pour chaque client.
Une fois la réponse obtenue tu retournes au poste client via les sockets la chaine résultante de ta requête au format XML par exemple.

Bon courage.... je suis en train de ré-écrire ce genre d'appli mais j'en suis à la phase... Client de communication... bref au début :-)
Posté le 26 mai 2013 - 20:24
Merci pour vos reponse Chris et Roman,

j'aurais aimé passer par le service qu'a crée CEGID mais je doute qu'ils veulent bien me donner le nom des variable a appeler pour executer mes requetes... je vais devoir crée un sevice je pense.
je vous tien au courant ;)
Membre enregistré
261 messages
Posté le 30 mai 2013 - 14:47
Bonjour,

Je revien vers vous pour vous donnez des nouvelle de mon projet.
J'ai crée un service et j'arrive bien a communiqué avec lui grace a une application avec la fonction
SocketConnect()
.
Maintenant que je veux rentrer dans le vif du sujet avec un
SQLConnect()
dans le service, cela ne fonctionne pas(la fonction revoi toujours 0)..., pourtant j'ai bien l'ODBC d'installer sur mon serveur.

merci de m'aiguiller sur ce probleme :merci:
Membre enregistré
27 messages
Posté le 30 mai 2013 - 15:18
Bonjour Baptiste,

Si tu veux procéder comme cela et que ton ODBC (ici 'Nav_Prod' un accès à une base de donnée de l'ERP Navision de M$ sous SQL Server) fonctionne depuis ton poste client, inutile de gérer les Socket :-) voici un exemple de code pour attaquer une base SQL (mais c'est du VFP donc quelques modifications à réaliser dans WinDev je pense) :

***
** MAJ lignes de commande dans Nav
***
** Connexion à la base de données
*
hConnection = SQLConnect('NAV_Prod', '', '')
IF hConnection > 0
=SQLSetProp(hConnection, 'asynchronous', .F.)
ELSE
WAIT WINDOW ('Connexion à SQL Serveur impossible') TIMEOUT 30
SET COVERAGE TO
QUIT
ENDIF

***
** MAJ DATE dans Commande_VP
*
SELECT Commandes_VP
GO TOP
IF nType = 0 && Analyse à partir des fichiers TXT générés par VP
SKIP && ON passe l'en-tête
ENDIF

***
** Clients bloqués dans l'ERP
** Requête d'extraction du fichier LOG de Nav
*
SET TEXTMERGE on
TEXT TO vReq noshow

SELECT [Date]
,[File Name]
,[Document No_]
,[Message]
,[Line No_]
,[Customer No_]
FROM [FPMONACO].[dbo].[Bdd$EDI Error Log]
WHERE DAY([Date]) = <<DAY(DATE())>> AND MONTH([Date]) = <<MONTH(DATE())>> AND YEAR([Date]) = <<YEAR(DATE())>> AND LEFT([Message],62) = 'Vous ne pouvez pas créer ce type de document lorsque le client'

ENDTEXT
SET TEXTMERGE off
hExec = SQLExec(hConnection, vReq, 'TableSQL')
=sleep(nTime)
IF hexec <> 1
WAIT WINDOW ('Pb-1'+CHR(13)+LEFT(vReq,245)) TIMEOUT 30
SET COVERAGE TO
QUIT
ELSE
=SQLMORERESULTS(hConnection)
SELECT tableSQL
ENDIF
IF RECCOUNT() > 0
***
** Au moins un client qui a le statut de bloqué dans Nav a reçu une commande de VP !!!
*
cLigneTot = tableSQL.Message
cLigne = cLigneTot + chr(13) + "Navision a stoppé la phase d'importation."+ chr(13)+ chr(13)+"Il faut modifier le statut du client puis relancer l'importation."
ELSE
SELECT Commandes_VP
DO WHILE !EOF()
***
** Requête d'extraction de l'en-tête du devis dans Nav
*
SET TEXTMERGE on
TEXT TO vReq noshow

SELECT [No_]
,[Quote No_]
,[Sell-to Customer No_]
,[Bill-to Name]
,[Ship-to Code]
,[Ship-to Name]
,[Order Date]
,[Posting Date]
,[Shipment Date]
,[Posting Description]
,[Invoice Disc_ Code]
,[Customer Disc_ Group]
,[Salesperson Code]
,[VAT Registration No_]
,[Bill-to County]
,[Document Date]
,[External Document No_]
,[Prepayment Due Date]
,[Prepmt_ Payment Terms Code]
,[Sell-to Contact No_]
,[Customer Priority Code]
,[Inter Sector]
,[Customer Group Code]
,[VP]
,[Export Date]
FROM [FPMONACO].[dbo].[Bdd$Sales Header]
WHERE [Quote No_] = '<<ALLTRIM(Commandes_VP.No_piece)>>' OR [No_] = '<<ALLTRIM(Commandes_VP.No_piece)>>'

ENDTEXT
SET TEXTMERGE off

hExec = SQLExec(hConnection, vReq, 'TableSQL')
=sleep(nTime)
IF hexec <> 1
WAIT WINDOW ('Pb-2'+CHR(13)+LEFT(vReq,245)) TIMEOUT 30
SET COVERAGE TO
QUIT
ELSE
=SQLMORERESULTS(hConnection)
SELECT tableSQL
ENDIF

IF RECCOUNT() > 0
cLigne = cLigne + CHR(13)+ CHR(10) + ALLTRIM(tableSQL.Sell_to_customer_no_) + '|' + ALLTRIM(tableSQL.Ship_to_Name) + '|' + ALLTRIM(tableSQL.Quote_No_) + '|' + ALLTRIM(tableSQL.No_) + '|' + ALLTRIM(DTOC(tableSQL.Order_Date)) + CHR(13)+ CHR(10)
cLigne = cLigne + REPLICATE('=',LEN(ALLTRIM(tableSQL.Sell_to_customer_no_) + '|' + ALLTRIM(tableSQL.Ship_to_Name) + '|' + ALLTRIM(tableSQL.Quote_No_) + '|' + ALLTRIM(tableSQL.No_) + '|' + ALLTRIM(DTOC(tableSQL.Order_Date)))) + CHR(13)+ CHR(10)
nCommandeNav = tableSQL.No_

***
** Contrôle au niveau des lignes du devis
*
SELECT Commandes_dt_VP
// Ici tu poursuis avec le curseur généré et stocké dans TableSQL par rapport à des traitements que tu souhaites réaliser avec ta table Hyperfile


Bon courage,
Roman