SQL au secour

Bonjour tout le monde,

En faite j’ai un problème qui m’apparait comme relativement complex car je ne domine pas le SQL du tout et mon boss me dit que c’est pas possible alors que c lui qui est censé savoir le faire.

J’ai une table avec des records pour des postes de production sur plusieurs ligne des infos du style
date, heure d’enregistrement,numéro de ligne,numéro de poste,des infos

Ce qu’il faudrait pouvoir faire, c’est connaître l’interval de temps pour chaque poste entre 2 records.

Donc j’aurrais du style

2/2/2004 14h00 ligne 2 poste 3
2/2/2004 14h02 ligne 2 poste 1
.
.
.
.un nombre inconnu d’autre record pour d’autre poste
.
2/2/2004 15h ligne 2 poste 3 <— et la on ajouterait dans un chant 1h

Je sais pas si je me fais bien comprendre.  Si quelqu’un avait un petit exemple sous la main ce serrait bien sympa.

Merci beaucoup pour toute piste de recherche car si c pas possible et bien je suis dans le kk.

Ce message a été édité par klimmrod le 08/09/2004

ça ne marcherait pas un truc dans le genre

update table_truc a
set a.intervalle = (a.time - (select max(b.time) from table_truc b where b.poste = a.poste and b.ligne = a.ligne and b.time < a.time)

(je ne sais pas si c’est vraiment possible, je ne suis pas une brute en sql)
sinon je n’ai pas beaucoup d’idées … désolé
Ce message a été édité par ko le 08/09/2004

Effectivement, c’est pas clair et c’est plein de fautes (champs/chant, sigh).
De plus, on sait pas si le traitement se fait “online” ou “une fois la journee finie”. genre:

Online:
insert_line(date,poste)
{
last=retrieve_latest(poste);
insert(date, poste, date-last);
}

Offline:
while(line_poste==poste)
{
  insert(date,poste, date-last);
  next_line;
}

En pseudo code, c’est l’idee quoi.

LoneWolf
C’est plus clair?

Tu mets la requête de ko sur un trigger en create et ton problème tel que je l’ai compris est résolu.

En faite c’est des données PLC qui sont craché sur un fichier texte qu’on va inscrire dans la base de donnée.  Donc c’est offline.  Enfin c’est comme ca que je le vois.

Lonewolf tu pourrais pas écrire un exemple de ta requête en instruction s’il te plaiut que je montre au gars que c effectivement possible .

C’est pas exactement la question de départ mais c’est vrai que sur les AS/400 on peut pas tout faire en SQL ?
Ce message a été édité par klimmrod le 08/09/2004

[quote]En faite c’est des données PLC qui sont craché sur un fichier texte qu’on va inscrire dans la base de donnée.  Donc c’est offline.  Enfin c’est comme ca que je le vois.[/quote] Dans ce cas, ce ne serait pas plus simple de créer un petit programme (PHP, Java/JDBC,…) chargé d’insérer dans la base de donnée le contenu du fichier? Pour chaque poste tu récupère le dernier accès au poste et tu calcule l’intervalle juste au moment d’insérer la ligne de ton fichier texte dans la base de donnée.

C’est pas compliqué à programmer et ça pourrait être réutilisable par la suite pour des fichiers similaires. De plus, profites-en pour glisser ton nom dans le prog/code source pour qu’on sache que c’est toi qui l’a fait. Ca évitera à ton patron d’être tenté de s’attribuer tes mérites alors qu’il est incompétent (comme tu le décrit)

Bah, vu que t’as un fichier texte, je pense que tu dois avoir un DTS quelque part, et tant qu’à faire qui se lance automatiquement. Donc tu peux utiliser ton DTS pour faire un truc du genre, pour chaque ligne:

SELECT @diff = DATEDIFF(hour, MAX(ma_table.date_utilisation), @date_utilisation) FROM ma_table
WHERE poste = @code_poste

INSERT la ligne avec la diff calculée

Cela marche car tu est certain que le MAX est bien la dernière utilisation de ton poste, étant donné justement que tu es en train d’insérer la prochaine, si tu vois ce que je veux dire.

En faite je suis en boulot étudiant et je fini vendredi et j’ai encore plein d’autre truc à finir.

Donc moi je voulais me virrer ça des pieds, car comme les bases de données sont en Anglettere et qu’ils ont qu’une double connexion ISDN avec l’extérieur, on peut pas vraiment travailler sur la base de donnée d’ici.  Le mieux c’est donc de lancer des requêtes de Belgique.  Et attendre que tout se fasse la-bas.

Donc il me faut bien une requête SQL, et au début de mon boulot on a pas voulu que je m’y connecte en ODBC et que j’y insère les données au file des heures.

Enfin voilà le pourquoi du comment je n’ai pas d’autre choix de la requête sql.

J’imagine que rien ne t’empêche de te connecter en remote sur le serveur en Belgique, ou en Angleterre, pour modifier le script ou le DTS qui se charge de remplir la table depuis le fichier texte. Ou sinon tu dis à ton boss que oui c’est possible, mais pas avec les conditions imposées; )

En faite ils ont prévu de le faire avec une espèce d’aplication client livrée ou vendue (je sais pas) avec les AS400 d’IBM et franchement je domine pas l’affaire.  Mais je pense pas que ce soit très souple.  C’est pour ca qu’une petite requête SQL me semblait la meilleure solution à tout mon problème.  Car pour tout expliquer moi je m’occupe de la partir PLC.

Si j’ai bien compris ton probleme, tu as un fichier TXT avec des lignes de donnees qu’il faut mettre dans une BDD.
J’imagine que tu parse ton fichier TXT pour ca, donc perso, je ferais un truc style

insert_line(poste,date)
{
  insert into bdd values(‘poste’,‘date’,‘date-last_date[poste]’);
  last_date[poste]=date;
}

avec last_date un tableau qui contient la derniere date entree pour chaque poste.

Le probleme reste le demarrage de la pompe, et le remplissage du tableau last_date avec la derniere date pour chaque poste (info dispo dans la bdd, a mon avis)

LoneWolf
Pas tres complique quoi…