Delphi7 & SQL

9 отговора 238 прегледа
#1

Delphi7 & SQL

От известно време се мъча с едни SQL заявки, но не мога да се справя (Нямам голям опит при работа с SQL).
За сведение: Delphi7, база данни MSAccess, компоненти ADO
Provider=Microsoft.Jet.OLEDB.4.0
Ето част от структурата на таблиците:
Таблица1:Dostavki
+------------+---------+--------+
|DateDostavka|ProductID|Quantity|
+------------+---------+--------+
|Дата1 | 1 | 10 |
|Дата2 | 2 | 20 |
|Дата1 | 2 | 5 |
|Дата3 | 1 | 3 |
|Дата2 | 3 | 10 |
+------------+---------+--------+

Таблица2:Production
+------------+---------+
|IDProduction|NameProd |
+------------+---------+
| 1 |Name1 |
| 2 |Name2 |
| 3 |Name3 |
+------------+---------+


Искам да получа следната таблица
+------------+---------+--------+--------+
|DateDostavka|Name1 |Name2 |Name3 |
+------------+---------+--------+--------+
|Дата1 | 10 | | |
|Дата2 | | 20 | |
|Дата1 | | 5 | |
|Дата3 | 3 | | |
|Дата2 | | | 10 |
+------------+---------+--------+--------+
Като използвам следната заявка
With ADOQuery1 do
begin
SQL.Clear;
SQL.Add('Select DateDostavka as Дата,Quantity as '+ ''''+ ADOTable2NameProd.AsString+'''');
SQL.Add('Where Dostavki.ProductID = '+''+ ADOTable2IDProduction.AsString+'');
Open;
end;
Ми извежда данните само за продукта, който съм избрал.
Използвах и команда Union, но ми натрупва данните в същата колона.
Поразрових се в интернет и намерих вариант за MySQL където използват нещо подобно
SQL.ADD('Select DateDostavka as Дата,'+
' Sum(If(DostavkaProduceID = '+''''+ ADOTable2ProduceID.AsString+''''+
', Quantity,0.00)) as Name...';
Но при използването на SUM дава грешка Access Violation module 'msjet40.dll', а като махна SUM
при извикване на заявката ми извежда следното съобщение
Undefined function 'If' in expression
Моля, ако някой е успял да направи нещо подобно да сподели опит.
Мнения използвай MySQL или подобни, само ще трупат излишно темата.

Отговор
в отговор на TRN #2

Re: Delphi7 & SQL

Доколкото разбирам става въпрос за изграждане на OLAP куб.
Можеш да използваш временни таблици, мемори таблици или компонент от вида на DecisionCube за изграждането му.

PS.
Ако ползваш тага [ pre] [ /pre] обясненията ти щяха да са още по-четливи

Редактирано от NDeu на

Отговор
в отговор на TRN #3

Re: Delphi7 & SQL

Това задължително ли трябва да е резултат от заявка? Защото с SQL такова нещо не може да се направи - там се казва какви колони искаш в самата заявка, а на теб броя колони ти е променлив (какво ще стане ако добавиш Name4?). Такова нещо се налага дотатъчно често да се прави и затова почти всички report пакети го могат - потърси в тази насока, вместо със заявка.
Ако те устройва, можеш да използваш Excel през automation и там да си направиш PivotTable. Не знам самия Access дали не може да прави някакъв такъв репорт.
Друго което се сещам е, че в Delphi 5 имаше един компонент - Decision Cube, който прави точно това, но не знам дали може да взима данните от DB или трябва да ги извлечеш и да му ги подадеш. За съжаления в по-късните версии на Delphi май го няма вече.

PS. Дали всъщност искаш да получиш това?:

+------------+---------+--------+--------+
|DateDostavka|Name1 |Name2 |Name3 |
+------------+---------+--------+--------+
|Дата1 | 10 | 5 | |
|Дата2 | | 20 | 10 |
|Дата3 | 3 | | |
+------------+---------+--------+--------+


Отговор
в отговор на TRN #4

Re: Delphi7 & SQL

Нещо такова може и да стане в MS Access:

TRANSFORM Sum([Dostavki].[Quantity]) AS Quantity
SELECT [Dostavki].[DateDostavka]
FROM Dostavki, Production
WHERE [Dostavki].[ProductID] = [Production].[IDProduction]
GROUP BY [Dostavki].[DateDostavka]
PIVOT [Production].[NameProd]

... абе идеята е да използваш TRANSFORM и PIVOT

Отговор
в отговор на lvan_ #5

Re: Delphi7 & SQL

Извинявам се за разместените таблици, но за [ pre][ /pre] не се сетих ( а и не съм го ползвал), иначе нямаше да си играя да оцветявам.
Благодаря ви за насоките, ще опитам всичко, което ми се вижда добро. А DecisionCube видях, че го има в Delphi 7. Дано да стане нещо.

Редактирано от TRN на

Отговор
в отговор на lvan_ #6

Re: Delphi7 & SQL

Благодаря, точно това стана.

Отговор
в отговор на TRN #7

Re: Delphi7 & SQL

Този синтаксис от ACCESS 'TRANSFORM/PIVOT' има ли аналог във FIREBIRD/INTERBASE, която и да е версия???

Отговор
в отговор на TRN #8

Re: Delphi7 & SQL

Аз не за разместените таблици - ако се загледаш, ще видиш че съдържанието на таблицата е различно (няма повтарящи се дати напр.)
Иначе Ivan_ направи много добро включване - това е начинът в случая, полезно беше и за мен.

Отговор
в отговор на Formal #9

Re: Delphi7 & SQL

Префасонирам една програма от DOS в Windows (правена от други и се опитвам да разбера какво са правили по крайния резултат) и там са с повтарящи се дати, но така е по-добре.

Отговор
в отговор на VladoVasilev #10

Re: Delphi7 & SQL

Ако въпроса е към мен, не съм запознат, за първи път виждам тази комбинация и добре, че ми свърши работа. При търсенето на решение се натъкнах на тази страница [линк]. Тя е за MySQL, но може да ти помогне нещо.

Отговор