Search  
Friday, May 25, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Client/Server  Comanda sql !...
 Comanda sql !
 
 11/12/2011 12:22:42 AM
User is offlineIONY
51 posts


Comanda sql !
 (N/A) Modified By IONY  on 11/12/2011 1:27:48 AM)
Buna am doua tabele,sold si plati, in tabela sold am facturile neplatite iar in tabela plati platile aferente fiecarei facturi, care pot fi partiale sau totale. In tabela sold am coloana data care este aferenta datei emiterii facturii iar in table plati- datapl este coloana aferenta ce contine data aferenta documentului de plata pentru a afla soldul facturilor am generat urmatoarea comanda: SELECT Sold.data, Sold.codfiscal, Sold.denumire, Sold.feldoc, Sold.nrfact,; Sold.totf, Sold.cont, SUM(Plati.platap) AS platap,; Sold.totf-SUM(Plati.platap) AS soldf, Sold.nrunik; FROM ; sold ; FULL JOIN plati ; ON Sold.nrunik = Plati.nrunik; GROUP BY Sold.data, Sold.feldoc, Sold.totf, Sold.cont, Sold.nrfact,; Sold.soldf, Sold.nrunik, Sold.codfiscal, Sold.denumire si totul e ok Dar m-am impotmolit la aflarea soldului facturilor la o anumita data
 11/12/2011 9:51:12 AM
User is offlineIONY
51 posts


Re: Comanda sql !
 (N/A)
Daca introduc conditia " WHERE sold.data<=data AND plati.datapl<=data" si am plati e ok dar daca nu am am plati nu imi mai intoarce nimic
 11/12/2011 10:24:25 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Comanda sql !
 (N/A) Modified By Daniel Buduru  on 11/12/2011 11:27:40 AM)
In join, daca nu exista inregistrari corespunzatoare conditiei de join intr-una din tabele, coloanele respective au valoarea null. Iar null nu este egal cu nici o valoare, nici macar cu null. 

SELECT a.data, a.codfiscal, a.denumire, a.feldoc, a.nrfact,;a .totf, a.cont, b.platap, a .totf-b.platap AS soldf, a.nrunik ;
from sold a left join ;
(select nrunic, sum(platap) as platap from plati where datap<data_sold+1 group by nrunik ) b;
on a.nrunik=b.nrunik ;
where a.data<data_sold+1


Conditia
de forma datap<data_sold+1 e optimizabila rushmore, insa datap<=data_sold nu este optimizabila.


Daniel Buduru
 11/12/2011 10:50:20 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Comanda sql !
 (N/A)
Comanda corecta pentru cazul in care nu ai plati este asta:
SELECT a.data, a.codfiscal, a.denumire, a.feldoc, a.nrfact,;a .totf, a.cont, nvl(b.platap,0) as platap, a .totf-nvl(b.platap,0) AS soldf, a.nrunik ;
from sold a left join ;
(select nrunic, sum(platap) as platap from plati where datap<data_sold+1 group by nrunik ) b;
on a.nrunik=b.nrunik ;
where a.data<data_sold+1



Daniel Buduru
 11/13/2011 12:46:01 AM
User is offlineIONY
51 posts


Re: Comanda sql !
 (N/A)
Mersi mult pentru ajutor Daniel!
 5/20/2012 1:08:58 PM
User is offlineflorinbad
27 posts
www.florinbad.com




Re: Comanda sql !
 (N/A) Modified By florinbad  on 5/20/2012 1:38:27 PM)
Daca se poate sa ma ajutati intr-o problema, ar fi super!
Aplicatia este client-server VFP9-MySQL.

Pentru o forma folosita la actualizarea datelor, am un tabel numit ARTICOLE (cu 20 de campuri in care se vor insera-modifica-sterge datele) si 5 nomenclatoare (NOM_ART, NOM_FURN, NOM_MAT, NOM_CALIT, NOM_STAS). Fiecare din aceste 5 tabele are 2 campuri (un id si o denumire).

NOM_ART: ID_DENART, DEN_ART
NOM_FURN: ID_FURN, DEN_FURN
NOM_MAT: ID_MAT, DEN_MAT
NOM_CALIT: ID_CALIT, DEN_CALIT
NOM_STAS: ID_STAS, DEN_STAS

Tabela ARTICOLE are un id unic si cele 5 id-uri, corespunzatoare id-urilor din cele 5 nomenclatoare.
La inserarea datelor ma descurc. La modificare-stergere nu ma descurc deoarece doresc sa afisez intr-un grid tabela ARTICOLE completata cu denumirile din nomenclatoare, urmand ca utilizatorul sa faca click pe inregistrarea de modificat-sters iar eu mi-am prins urechile in SELECT-ul pentru afisarea datelor...
(M-am folosit de documentatia din MySQL Demo de pe acest site. Am incercat si cu WHERE (Articole.Id_Denart=Nom_Art.Id_Denart) AND (Articole.Id_Furn=Nom_Furn.Id_Furn) etc., insa nu a mers.

Sir_lung = "SELECT " + ;
"articole.id_denart, " + ;
"articole.id_furn, " + ;
"articole.id_mat, " + ;
"articole.id_calit, " + ;
"articole.id_stas, " + ;
"Nom_Art.Den_Art AS Denumire Articol, " + ;
"Nom_Furn.Furnizor AS Furnizor, " + ;
"Articole.Desen_Stas AS Desen Tehnic sau STAS, " + ;
"Nom_Mat.Den_Mat AS Material, " + ;
"Nom_Calit.Calit_Mat AS Calitate Material, " + ;
"Nom_Stas.Stas_Tipo AS Stas Tipodimensiuni, " + ;
"Articole.Dimensiune, " + ;
"Articole.Greut_Tehn, " + ;
"Articole.Greut_Neta, " + ;
"Articole.UM AS UnitateMasura, " + ;
"Articole.Nivel, " + ;
"Articole.Epr AS Epruveta, " + ;
"Articole.Prov AS Provenienta, " + ;
"Articole.Oper, " + ;
"Articole.Nume, " + ;
"Articole.Data, " + ;
"Articole.Ora " + ;
"FROM " + ;
"articole,nom_art,nom_furn,nom_mat,nom_calit,nom_stas " + ;
"INNER JOIN Nom_Art ON (Articole.Id_Denart=Nom_Art.Id_Denart) " + ;
"INNER JOIN Nom_Furn ON (Articole.Id_Furn=Nom_Furn.Id_Furn) " + ;
"INNER JOIN Nom_Mat ON (Articole.Id_Mat=Nom_Mat.Id_Mat) " + ;
"INNER JOIN Nom_Calit ON (Articole.Id_Calit=Nom_Calit.Id_Calit) " + ;
"INNER JOIN Nom_Stas ON (Articole.Id_Stas=Nom_Stas.Id_Stas) " + ;
"ORDER BY " + ;
"Nom_Art.Den_Art, " + ;
"Articole.Desen_STas"

Scuzati-mi diletantismul in SQL si multumesc anticipat pentru raspuns.
 5/20/2012 10:03:37 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Comanda sql !
 (N/A)
Aparent e bine. N-ai spus ce mesaj de eroare primesti asa ca singura chestie pe care o vad in neregula sunt spatiile din denumirile campurilor de pe la Nom.Den As chestie cu spatii. N-am VFP asa ca nu pot sa verific (nu mai stiu sigur daca poti sa ai spatii in denumirile cursoarelor, parca tin minte ca nu). Scoate spatiile si incearca din nou.

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 5/20/2012 11:01:01 PM
User is offlineflorinbad
27 posts
www.florinbad.com




Re: Comanda sql !
 (N/A)
Intre timp am (mai) pus burta pe carte si SELECT-ul a mers, din aproape in aproape, folosind WHERE (Articole.Id_Denart=Nom_Art.Id_Denart) AND (Articole.Id_Furn=Nom_Furn.Id_Furn) etc. precum si doua clauze LIKE in care fac niste filtre pentru denumire si numarul de desen.

Timpul de raspuns este de 2-3 secunde (pe Localhost) din selectarea a 126.000 de inregistrari ale tabelei Articole si consultarea celor 5 nomenclatoare. Sa vad maine cum se comporta in retea...

Acum as dori sa aflu daca se poate ca la afisarea in grid un camp sa fie alcatuit din concatenarea a doua campuri din doua tabele diferite.
Pe scurt, ceva de forma:
ALLTRIM(nom_art.denumire)+' '+ALLTRIM(nom_furn.furnizor) as Denumire
Mie nu mi-a mers...
 5/21/2012 3:48:21 AM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Comanda sql !
 (N/A)
WHERE ala e un JOIN, asa cum il folosesti tu. Sfatul meu e sa incerci sa intelegi de ce cu where a mers si cu join nu - ai gresit pe undeva cand ai facut join-ul. Foloseste LEFT JOIN, nu INNER JOIN. Citeste care e diferenta dintre LEFT si INNER, ca acum e devalmasie acolo la tine - daca se intampla ceva nu stii sa repari.

Ca sa-ti raspund la intrebare: Ce vrei tu nu se poate DECAT daca specifici si clauza de JOIN dintre cele doua tabele. Daca nu o specifici inseamna ca vrei sa aduni valoarea dintr-un camp al unei tabele cu TOATE valorile din TOATE inregistrarile celeilalte tabele.
Pe de alta parte, nu inteleg unde vrei sa ajungi. Articolul ala poa'sa vina de la mai multi furnizori. Scrie selectul care-ti descarca inregistrarile asa cum trebuie, apoi in grid, in controlsource pui "crs.Camp1 + crs.Camp2"

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 5/21/2012 12:04:44 PM
User is offlineflorinbad
27 posts
www.florinbad.com




Re: Comanda sql !
 (Romania) Modified By florinbad  on 5/21/2012 12:07:43 PM)
Multumesc pentru sfat!
Intr-adevar, spatiile de la "AS" erau de vina... Le-am inlocuit cu liniuta de subliniere.
Am modificat cu LEFT JOIN iar timpul de procesare a scazut (pe Localhost) de la 9 sec la 4-5 sec (aici, la firma, am un PC foarte slab, spre deosebire de cel de acasa, unde afisarea este instantanee). Voi face teste cu serverul firmei, pentru a vedea viteza de raspuns.

In ceea ce priveste a doua problema, userii pentru care rescriu aplicatia (din fox 2.6) s-au obisnuit din comoditate sa insereze in denumirea articolului si firma furnizoare. Sunt obligat sa pastrez si datele vechi (cele 126.000 de inregistrari), insa de acum incolo ii oblig sa introduca furnizorul separat, eu unind cele doua campuri doar in prelucrarile de dinaintea scoaterii rapoartelor (gen replace câmpmare with alltrim(câmp1)+" "+alltrim(câmp2), intr-o tabela temporara).

Multumesc inca o data pentru sfaturi.
Sa aveti cu totii o zi impecabila!
 5/21/2012 12:09:05 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Comanda sql !
 (N/A)
Nu-mi dau seama de ce a scazut timpul, fiindca WHERE si JOIN sunt 100% echivalente in scenariul ala. Daca vrei sa optimizezi si mai mult interogarea, pune indecsi pe toate campurile implicate in JOIN si ORDER BY, nu folosi NOT, nu folosi ALLTRIM, PADL, si altele asemenea (functii string pe valorile din campuri).

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
  Visual FoxPro  Client/Server  Comanda sql !...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement