Delphi7 & SQL
9 отговора
238 прегледа
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 или подобни, само ще трупат излишно темата.
За сведение: 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 или подобни, само ще трупат излишно темата.
Re: Delphi7 & SQL
Доколкото разбирам става въпрос за изграждане на OLAP куб.
Можеш да използваш временни таблици, мемори таблици или компонент от вида на DecisionCube за изграждането му.
PS.
Ако ползваш тага [ pre] [ /pre] обясненията ти щяха да са още по-четливи
Можеш да използваш временни таблици, мемори таблици или компонент от вида на DecisionCube за изграждането му.
PS.
Ако ползваш тага [ pre] [ /pre] обясненията ти щяха да са още по-четливи
Редактирано от NDeu на
Re: Delphi7 & SQL
Това задължително ли трябва да е резултат от заявка? Защото с SQL такова нещо не може да се направи - там се казва какви колони искаш в самата заявка, а на теб броя колони ти е променлив (какво ще стане ако добавиш Name4?). Такова нещо се налага дотатъчно често да се прави и затова почти всички report пакети го могат - потърси в тази насока, вместо със заявка.
Ако те устройва, можеш да използваш Excel през automation и там да си направиш PivotTable. Не знам самия Access дали не може да прави някакъв такъв репорт.
Друго което се сещам е, че в Delphi 5 имаше един компонент - Decision Cube, който прави точно това, но не знам дали може да взима данните от DB или трябва да ги извлечеш и да му ги подадеш. За съжаления в по-късните версии на Delphi май го няма вече.
PS. Дали всъщност искаш да получиш това?:
Ако те устройва, можеш да използваш Excel през automation и там да си направиш PivotTable. Не знам самия Access дали не може да прави някакъв такъв репорт.
Друго което се сещам е, че в Delphi 5 имаше един компонент - Decision Cube, който прави точно това, но не знам дали може да взима данните от DB или трябва да ги извлечеш и да му ги подадеш. За съжаления в по-късните версии на Delphi май го няма вече.
PS. Дали всъщност искаш да получиш това?:
+------------+---------+--------+--------+
|DateDostavka|Name1 |Name2 |Name3 |
+------------+---------+--------+--------+
|Дата1 | 10 | 5 | |
|Дата2 | | 20 | 10 |
|Дата3 | 3 | | |
+------------+---------+--------+--------+
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
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
Re: Delphi7 & SQL
Извинявам се за разместените таблици, но за [ pre][ /pre] не се сетих ( а и не съм го ползвал), иначе нямаше да си играя да оцветявам.
Благодаря ви за насоките, ще опитам всичко, което ми се вижда добро. А DecisionCube видях, че го има в Delphi 7. Дано да стане нещо.
Благодаря ви за насоките, ще опитам всичко, което ми се вижда добро. А DecisionCube видях, че го има в Delphi 7. Дано да стане нещо.
Редактирано от TRN на
Re: Delphi7 & SQL
Този синтаксис от ACCESS 'TRANSFORM/PIVOT' има ли аналог във FIREBIRD/INTERBASE, която и да е версия???
Re: Delphi7 & SQL
Аз не за разместените таблици - ако се загледаш, ще видиш че съдържанието на таблицата е различно (няма повтарящи се дати напр.)
Иначе Ivan_ направи много добро включване - това е начинът в случая, полезно беше и за мен.
Иначе Ivan_ направи много добро включване - това е начинът в случая, полезно беше и за мен.
Re: Delphi7 & SQL
Префасонирам една програма от DOS в Windows (правена от други и се опитвам да разбера какво са правили по крайния резултат) и там са с повтарящи се дати, но така е по-добре.
Re: Delphi7 & SQL
Ако въпроса е към мен, не съм запознат, за първи път виждам тази комбинация и добре, че ми свърши работа. При търсенето на решение се натъкнах на тази страница [линк]. Тя е за MySQL, но може да ти помогне нещо.