Search  
Thursday, October 22, 2020 ..:: 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  Tema pentru acasa  interogare...
 interogare
 
 10/15/2013 7:16:23 PM
User is offlinemarius.crisan
6 posts


interogare
 (N/A)
buna ziua. baza de date cu produse, exista mai multe intrari pentru anumit produs diferite valori pentru cantitate pentru pret si pentru valoare. as dori sa am un raport cu diferite criterii de afisare. de exemplu sa listez produsele cu o anumita data , dar sa nu apara produsul duplicat pentru intrari separate ci o lista care sa insumeze produsele identice si valoarea lor din data respectiva. poate cu un exemplu as fi mai explicit. sa zicem ca avem apa 2.5lei buc 1 12.10.13 apa 3lei buc 3 12.10.13 apa 2.5lei buc 5 12.10.13 cuie 4 lei buc 4 12.10.13 cuie 4 lei buc 4 12.10.13 atunci , raportul sa arate activitatea in 12/10 : apa 9 buc 8lei 12.10.13 cuie 8 buc 8lei 12.10.13 incerc sa realizez proiectul in 2.6 dar sunt bucuros de orice sfat, doar sa stiu de unde sa incep. am incercat cu report cu sql select si nu am reusit. cred ca este evident ca sunt incepator si orice sfat e binevenit. multumesc
 10/15/2013 9:21:11 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: interogare
 (Romania)
Trebuie sa insumezi cantitate si valoarea (cantitate*pret) grupat pe articol si data, filtrat cu data la care vrei raportul.
Intrucat formatul datei depinde de SET DATE, este mai sigur sa o convertesti la forma string AAAALLZZ, conversie care se face cu functia DTOS

Select produs, Sum(cantitate) as cant, Sum(cantitate*pret) as valoare, data ;
From tabela_produse ;
Where Dtos(data)='20131012' ;
Group by produs, data ;
Order by produs ;
Into cursor crsIntrari


Daniel Buduru
 10/16/2013 1:58:39 PM
User is offlinemarius.crisan
6 posts


Re: interogare
 (N/A)
multumesc mult pentru raspunsul prompt. foarte explicit si de mare ajutor. mai am o intrebare referitoare la clauza "into cursor". 2.6 poate folosii pointerul respectiv pt afisare, printare, etc , operatii de iesire ? si cum? multumesc
 10/16/2013 3:27:03 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: interogare
 (Romania)
Daca nu este specificata clauza INTO (table sau cursor), este creat implicit un cursor cu aliasul query, care este si afisat imediat in browse.
Cursorul este o tabela temporara, creata in memorie, tabela care dispare atunci cand este inchisa cu comanda USE sau cand se inchide aplicatia in care a fost creata.
Tabela temporara asociata cursorului poate fi gasita cu functia DBF(alias_cursor)
Poate fi utilizat ca orice tabela, poate fi selectat cu comanda Select alias_cursor, poate fi afisat cu comanda Browse, poate fi listat, poate fi utilizat in report.
De exemplu:

Select produs, Sum(cantitate) as cant, Sum(cantitate*pret) as valoare, data ;
From tabela_produse ;
Where Dtos(data)='20131012' ;
Group by produs, data ;
Order by produs ;
Into cursor crsIntrari

Select crsIntrari

Browse


Daniel Buduru
 10/16/2013 4:03:13 PM
User is offlinemarius.crisan
6 posts


Re: interogare
 (N/A)
logic. dupa ce inteleg. multumesc inca o data pentru ajutor si pentru promptitudine
 10/17/2013 3:41:26 PM
User is offlinemarius.crisan
6 posts


Re: interogare
 (N/A)
am intalnit o noua problema cu select din multiple tabele. am tot incercat sa o rezolv singur dar nu am reusit in speranta de a evita sentimentul de ce usor a fost dupa explicartii dar nu reusesc.
deci
doua tabele , vanzari si intrari, aceleasi evenimente. inserare de date cu valori duplicate la campul denumire
interogarea pe care as vrea sa o realizez face , pe scurt stocul, face diferenta intre suma cantitatilor pe produs
am incercat diferite modalitati , pe scurt :

select vanzari.prod , sum(vanzari.cant)-sum(intrari.cant) as cantitate from vanzari,intrari where vanzari.prod=intrari.prod

plus diferite altele pe care probabil le-am incercat din lipsa de idei

multumesc
 10/17/2013 4:48:56 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: interogare
 (Romania)
 marius.crisan wrote
am intalnit o noua problema cu select din multiple tabele. am tot incercat sa o rezolv singur dar nu am reusit in speranta de a evita sentimentul de ce usor a fost dupa explicartii dar nu reusesc.
deci
doua tabele , vanzari si intrari, aceleasi evenimente. inserare de date cu valori duplicate la campul denumire
interogarea pe care as vrea sa o realizez face , pe scurt stocul, face diferenta intre suma cantitatilor pe produs
am incercat diferite modalitati , pe scurt :

select vanzari.prod , sum(vanzari.cant)-sum(intrari.cant) as cantitate from vanzari,intrari where vanzari.prod=intrari.prod

plus diferite altele pe care probabil le-am incercat din lipsa de idei

multumesc

Ar fi trebuit sa postezi in sectiunea FoxPro. FPD 2.6 are vreo 20 de ani, implementarea sql este mult mai restransa decat in vfp.  Oricum, tot e bine ca inveti sa lucrezi cu Sql.

E mai eficienta configuratia cu o singura tabela pentru intrari si iesiri, avand articol, pret unitar, cantitate intrata, cantitate iesita, data.
Tabela consolidata se poate obtine printr-o comanda sql:

Select prod, pret, cant as intrare, 000000.000 as iesire, data from intrari;
Union all ;
Select prod, pret, 0 as intrare, cant as iesire, data from vanzari;
Into cursor crsInOut

Select prod, sum(intrare*pret-iesire*pret) as valoare, sum)intrare-iesire) as stoc from crsInOut group by prod Into cursor crsstoc
Browse

Intr-un select in FoxPro sau VFP (mai putin versiunea 9), o coloana este dimensoinata dupa prima valoare intalnita. Din acest motiv, in primul select trebuie sa pui 000000.000 la iesire, pentru a forta formatul coloanei numeric (10,3). Daca pui doar 0, coloane iesire va fi numeric (1) si va altera toate valorile aduse din tabela vanzari.


Daniel Buduru
 10/17/2013 8:07:34 PM
User is offlinemarius.crisan
6 posts


Re: interogare
 (N/A)
am incercat si eu cu union dar primeam o eroare "select`s are not union compatible" si am abandonat, dupa ce am incercat si codul dumneavoastra si am primit aceiasi eroare am mai studiat putin problema
si am aflat ca in 2,6 cel putin, campurile din Select trebuie sa fie identice , atunci am inversat in al doi-lea Select ordinea campurilor respectiv: prod, pret, cant as iesire, 0 as intrare, data
si am scapat de "select`s are not union compatible"

singura problema e ca in loc sa imi scada intrari-iesiri , le aduna.

multumesc si scuze daca am gresit sectiunea din forum
 10/17/2013 8:34:57 PM
User is offlineDaniel Buduru
3522 posts
1st




Re: interogare
 (Romania)
 marius.crisan wrote
am incercat si eu cu union dar primeam o eroare "select`s are not union compatible" si am abandonat, dupa ce am incercat si codul dumneavoastra si am primit aceiasi eroare am mai studiat putin problema
si am aflat ca in 2,6 cel putin, campurile din Select trebuie sa fie identice , atunci am inversat in al doi-lea Select ordinea campurilor respectiv: prod, pret, cant as iesire, 0 as intrare, data
si am scapat de "select`s are not union compatible"

singura problema e ca in loc sa imi scada intrari-iesiri , le aduna.

multumesc si scuze daca am gresit sectiunea din forum

Vezi mai intai daca ai aceeasi structura in ambele tabele. Vezi tipul si lungimea campurilor.
Ordinea campurilor este corecta asa cum am pus-o eu. Cand ai schimbat ordinea, ai pus iesirea in campul de intrare. La union campurile sunt luate in ordine, nu dupa denumire, deci in tabela primul camp va contine valorile campurilor din pozitia 1 din urmatoarele selecturi, indiferent cum se numeesc ele.
Uite un exemplu:

CREATE CURSOR intrari (prod c (10), cant n (10,3), pret n(10,3), data d)
INSERT INTO intrari VALUES ('prod1',5,10.2,DATE())
INSERT INTO intrari VALUES ('prod1',2,8.0,DATE()-3)
INSERT INTO intrari VALUES ('prod2',4,9.5,DATE()-2)
CREATE CURSOR vanzari (prod c (10), cant n (10,3), pret n(10,3), data d)
INSERT INTO vanzari VALUES ('prod1',3,10.2,DATE())
INSERT INTO vanzari VALUES ('prod2',2,9.5,DATE())

SELECT prod, cant as intrare, 000000.000 as iesire, data FROM intrari ;
UNION ;
SELECT prod, 0 as intrare, cant as iesire, data FROM vanzari INTO CURSOR crsInOut
BROWSE LAST

SELECT prod, SUM(intrare - iesire) as stoc, SUM(intrare) as intrari, SUM(iesire) as iesiri FROM crsinout GROUP BY prod INTO CURSOR stoc
BROWSE LAST

Nu am cum testa in FoxPro; Daca spune si in exemplul meu ca selecturile nu sunt compatibile, pune 000000.000 as intrare in selectul al doilea.

Daniel Buduru
 10/17/2013 10:02:36 PM
User is offlinemarius.crisan
6 posts


Re: interogare
 (N/A)
am reusit pana la urma , ar fi mers si primul exemplu . dupa ce am citit despre eroarea "select`s are not union compatible" am inteles ca trebuie alocat un camp suficient de mare pentru a putea face calculele
si cum tabelele mele sunt pline de teste , numere mari , se pare ca nu am alocat destule cifre campurilor pentru a face unionul.

cel putin asta am dedus eu.
inca o data . multumesc pentru ajutorul acordat
 10/17/2013 10:36:38 PM
User is offlineGrigore Dolghin
4001 posts
www.class-software.ro
1st






Re: interogare
 (N/A)
Mesajul ala de eroare apare cand vrei sa faci union intre tabele care nu sunt corespondente 100% (lipsesc campuri sau au latimi diferite). Latimea efectiva nu conteaza, poa'sa fie si de un caracter. Da' daca e de un caracter la o tabela, tot de un caracter tre'sa fie si la cealalta tabela, altfel vomita carabusi.

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
  Visual FoxPro  Tema pentru acasa  interogare...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2013 Profox   Terms Of Use  Privacy Statement