Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
[RÉSOLU] Récupérer résultat d'une requête dans 1 variable ?
Auteur Message
Répondre en citant
Message [RÉSOLU] Récupérer résultat d'une requête dans 1 variable ? 
Voici la demande :

Pour un de nos clients, notre logiciel génère un fichier (relevé de prestations) pour chaque adhérent, pour chacune de ses prestations.
Le fichier se nomme PREFIXE_1234567890_987654321.PDF (où 1234567890 est le n° d'adhérent, et 987654321 le n° de relevé).

Il y a eu un bug qui fait que des prestations ont eu plusieurs relevés générés, avec chacun un n° de relevé différent.
Seulement, chaque prestation n'a qu'un n° de relevé en base.
Le client se retrouve donc, pour chacun de ses adhérents, avec N relevés, dont N-1 ne sont plus "bons" (ils ne pointent plus vers aucune prestation).

Je souhaite donc faire un batch :
- que l'on place dans le répertoire où sont les PDF
- qui parcourt le répertoire
- qui récupère la partie 987654321 (après le 2e underscore, et avant l'extension) de chaque fichier
- qui exécute une requête du type : select count(*) from matable where macolonne = 987654321
- qui, si cette requête vaut 0, renomme le fichier en .old (il ne correspond plus à rien).

Pour information, nous utilisons DB2.

Voici mon batch :

Code:

@echo off
REM
REM Fiche ***** $*****$ 10/12/2013
REM Batch qui parcourt des fichiers PDF (décomptes au format PREFIXE_xxxxxxxxxx_yyyyyyyyy.pdf), verifie qu'ils sont bien rattaches a une prestation, et les renomme si ce n'est pas le cas.
REM
cls

setlocal enabledelayedexpansion

REM Initialisation des variables
set repertoire=%~dp0
set compteur=0
set nbfichiers=0
set suffixe=.old

REM Initialisation des parametres
set /p bddDialogue= Nom de la base de donnees :

IF "%bddDialogue%"== "" (
   echo Nom de base non renseigne
   goto Fin
)


set /p user= Utilisateur :

IF "%user%"== "" (
   echo Utilisateur non renseigne
   goto Fin
)


set /p mdp= Mot de passe :

IF "%mdp%"== "" (
   echo Mot de passe non renseigne
   goto Fin
)

echo.
@echo off

REM Nettoie les traces de fichiers precedents pour partir de fichiers vides
if exist "###controle-RELEVES-%bddDialogue%.log" DEL "###controle-RELEVES-%bddDialogue%.log"
if exist "tempfile.txt" DEL "tempfile.txt"

REM Cree les fichiers log et temporaire
SET logfile=###controle-RELEVES-%bddDialogue%.log
SET outTextFile=tempfile.txt

REM Boucle sur les fichiers PDF et opérations de renommage
for %%a IN (%repertoire%*.PDF) DO (

   REM On ne recupere que le nom du fichier (sans le chemin ni l extension)
   set nomfic=%%~na

   REM On recupere la fin du fichier, apres le deuxieme underscore (le seq_num)
   for /f "tokens=3 delims=_" %%b in ("!nomfic!") do (
      set seqnum=%%b
      echo connect to %bddDialogue% user %user% using %mdp% ; > %outTextFile%
      echo SELECT count^(distinct colonne1^) FROM matable WHERE colonne2 ^= !seqnum! ; >> %outTextFile%
      db2cmd /c /w /i "db2 -td; -f " %outTextFile% > %logfile%
      REM ??? Recuperation du resultat du count dans la variable compteur, a voir ???
      REM S il est egal a zero on renomme le fichier
      if %compteur% == 0 (
         set /A nbfichiers+=1
         rename %%~nxa %%~nxa%suffixe%
      )
   )
)

echo Fin du renommage : %nbfichiers% fichiers renommes
:Fin
if exist %outTextFile% DEL %outTextFile%

pause


Merci d'avance. Smile



Dernière édition par Saria le Mer 11 Déc 2013 - 09:49; édité 1 fois
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message [RÉSOLU] Récupérer résultat d'une requête dans 1 variable ? 
Il fonctionne ton batch ????

Sinon quel est le problème ???

Okay




______________________________________________________
AffPng.exe , StringBetween.exe , Hex2Png.exe
Répondre en citant
Message [RÉSOLU] Récupérer résultat d'une requête dans 1 variable ? 
Bonjour !

Oui, il fonctionne.
Le souci est que je ne veux récupérer QUE le résultat de ma requête.

Lorsque j'exécute le db2cmd et et que je récupère le résultat dans %logfile% (db2cmd /c /w /i "db2 -td; -f " %outTextFile% > %logfile%), j'obtiens trop d'informations :
Citation:


Informations de connexion à la base de données



Serveur de base de données = DB2/NT64 9.7.5

ID utilisateur SQL = DBA

Alias local de la base de données = ******







1

-----------

2



1 enregistrement(s) sélectionné(s).


Dans mon cas, je ne veux récupérer que le "2" (le résultat du count) dans ma variable %compteur%.
Ainsi, si %compteur% vaut plus que zéro, je ne fais rien, mais s'il vaut zéro, je renomme mon fichier.

Code:

db2cmd /c /w /i "db2 -td; -f " %outTextFile% > %logfile%

REM ??? Comment je traite %logfile% pour recuperer le "2" du %logfile% ci-dessus dans %compteur% ???

REM Si resultat du count est egal a zero on renomme le fichier
if %compteur% == 0 (
  set /A nbfichiers+=1
  rename %%~nxa %%~nxa%suffixe%
)






EDIT : Finalement j'ai trouvé. Cool


Code:

@echo off
REM
REM Fiche ***** $*****$ 10/12/2013
REM Batch qui parcourt des fichiers PDF (décomptes au format PREFIXE_1234567890_9876543210.pdf), verifie qu'ils sont bien rattaches a une prestation, et les note si ce n'est pas le cas.
REM
cls

setlocal enabledelayedexpansion

REM Initialisation des variables
set repertoire=%~dp0
set nbfichiers=0
REM set suffixe=.old

REM Initialisation des parametres
set /p bddDialogue= Nom de la base de donnees :

IF "%bddDialogue%"=="" (
   echo Nom de base non renseigne
   goto Fin
)


set /p user= Utilisateur :

IF "%user%"=="" (
   echo Utilisateur non renseigne
   goto Fin
)


set /p mdp= Mot de passe :

IF "%mdp%"=="" (
   echo Mot de passe non renseigne
   goto Fin
)

echo.
@echo off

REM Nettoyage des traces de fichiers precedents pour partir de fichiers vides
if exist "###controle-RELEVES-%bddDialogue%.txt" DEL "###controle-RELEVES-%bddDialogue%.txt"
if exist "tempfile.txt" DEL "tempfile.txt"

REM Creation des fichiers log et temporaire
SET logfile=###controle-RELEVES-%bddDialogue%.txt
SET outTextFile=tempfile.txt
SET resultfile=###liste-RELEVES-errones-%bddDialogue%.txt

REM Boucle sur les fichiers PDF
for %%a IN (%repertoire%*.PDF) DO (
   REM Recuperation du nom du fichier (sans le chemin ni l extension)
   set nomfic=%%~na

   REM Recuperation de la fin du nom de fichier, apres le deuxieme underscore (le seq_num)
   for /f "tokens=3 delims=_" %%b in ("!nomfic!") do (
      set seqnum=%%b
      echo connect to %bddDialogue% user %user% using %mdp%; > %outTextFile%
      echo SELECT count^(distinct macolonne1^) as nombre FROM matable WHERE macolonne2 ^= !seqnum!; >> %outTextFile%
      echo terminate; >> %outTextFile%
      db2cmd /c /w /i "db2 -td; -f " %outTextFile% > %logfile%
      
      REM Recuperation du resultat present dans logfile
      set resultat=
      for /f "skip=11 tokens=1 delims==" %%i in ('type %logfile%') do (
         if not defined resultat (            
            set resultat=%%i
         )
      )
      
      REM Enlever les espaces dans resultat
      for /f "tokens=*" %%j in ("!resultat!") do set resultatsansespace=%%~j
      
      echo nombre de decomptes rattaches a !nomfic!: !resultatsansespace!
      
      REM Si le resultat est egal a zero on identifie le fichier
      if !resultatsansespace!==0 (
         set /A nbfichiers+=1
         REM Stockage du nom du fichier dans un fichier resultfile
         echo %%~nxa >> %resultfile%
         REM Renommage du fichier
         REM rename %%~nxa %%~nxa%suffixe%
      )
   )
)

echo Fin de la verification
if %nbfichiers% NEQ 0 echo %nbfichiers% fichiers identifies >> %resultfile%

:Fin
if exist %outTextFile% DEL %outTextFile%

pause


Maintenant, je vais chercher :
1) Comment faire pour qu'il puisse parcourir des sous-répertoires

MONDOSSIER : mettre le batch dedans, et éventuellement une série de PDF dedans
|_ SOUS-DOSSIER1 : mettre une série de PDF dedans
|_ SOUS-DOSSIER2 : mettre une série de PDF dedans
|_ ...
Arrow for %%a IN ('dir /S "%repertoire%"' *.PDF) DO ( ne fonctionne pas (il me prend bien les PDF dans MONDOSSIER, mais pas ceux dans SOUS-DOSSIER1)

2) Comment vérifier que les identifiants de connexion à la base ne sont pas corrects, avant même le parcours des fichiers.
Arrow Fait. Wink



Répondre en citant
Message [RÉSOLU] Récupérer résultat d'une requête dans 1 variable ? 
Sujet résolu Wink




______________________________________________________


L'ignorance est un fléau qui engendre la haine et la mort
La connaissance est une arme qui surpasse toutes les autres
Partagez votre savoir, sinon il sera perdu à jamais
Message [RÉSOLU] Récupérer résultat d'une requête dans 1 variable ? 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch