2017-01-18 10 views
-1

Я хотел бы отфильтровать данные из MS Access и получить их в LazReport. Я пробовал несколько комбинаций кода, но никто из них не работал. Я все еще получаю ошибку «Типы данных не равны в выражении критерий». Поле MS Access установлено в Date/Time с форматом Short Date (01.01.2017). DateTimePicker установлен на YMD (Год, Месяц, День).Delphi/Lazarus Фильтр данных MSAccess SQL Query с использованием DateTimePicker

Это мой код:

procedure TForm12.BitBtn1Click(Sender: TObject); 
    begin 
    If ListBox1.ItemIndex=0 then 
    ReportSelected.Caption:=Listbox1.Items[Listbox1.ItemIndex]; 

    If ListBox1.ItemIndex=1 then 
    ReportSelected.Caption:=Listbox1.Items[Listbox1.ItemIndex]; 

    If ListBox1.ItemIndex=2 then 
    ReportSelected.Caption:=Listbox1.Items[Listbox1.ItemIndex]; 

    If ListBox1.ItemIndex=3 then 
    ReportSelected.Caption:=Listbox1.Items[Listbox1.ItemIndex]; 

    If (ReportSelected.Caption='Production Overview') And (DBLookUpListBox1.ItemIndex <> -1) And (CboShift.ItemIndex = 0) then 
     begin 
     SQLQuery_ReportShift.Active:=true; 
     SQLQuery_ReportShift.Close(); 
     SQLQuery_ReportShift.SQL.Text:='SELECT ProductionDate, Shift, AssemblyLine, Product, OperatorsAvailable, ProductionTime, CleanProductionTime, DowntimeTime, GoodParts, ScrapTotal, ScrapRate, QualityRate, Availability, Performance, OEE FROM ProductionInfo WHERE AssemblyLine='''+DBLookUpListBox1.Items[DBLookUpListBox1.Itemindex]+''' AND  ProductionDate='''+FormatDateTime('dd/mm/yyyy', DateTimePicker1.Date)+''''; 
     SQLQuery_ReportShift.Open(); 

    frReport1.LoadFromFile('ProductionOverview.lrf'); 
    frReport1.ShowReport; 
end; 
+0

Почему тег 'mysql'? Вы говорите, что работаете с таблицей MS Access. – MartynA

+0

Использует ли ваша машина '.' как глобальный разделитель даты? '/' более обычен. Возможно, вам придется использовать файловую форму FormatDateTime и настроить формат для тех, которые требуются MS Access. – Dsm

+0

Попробуйте это: поместите TDBLabel в свою форму, подключите его к полю ProductionDate и сообщите нам, что именно оно отображает. – MartynA

ответ

0

Если я правильно помню, Access использует дату в порядке Y/M/D и путы '#' символы вокруг него:

function AccessDate(d:TDateTime) : string; 
var 
    yy,mm,dd : word; 
begin 
    DecodeDate(d, yy,mm,dd); 
    result := Format('#%d/%d/%d#', [yy,mm,dd]); 
end; 

Что касается DateTimePicker возвращает только дату: выключите временные части, проверив dtpHour, dtpMinute и dtpSecond в HideDateTimeParts.

+0

Я полагаю, что мне нужно назначить эту функцию DateTimePicker на event FormShow, я прав? Затем, когда я использую этот DateTimePicker в Query, он должен работать ... – Revan31

+0

@ Revan31: Нет, вы должны использовать функцию «AccessDate» для построения запроса Sql. – MartynA

+0

Хмм, я никогда не встречал такого запроса. Не могли бы вы указать мне или обновить мой запрос с помощью этой функции? – Revan31