Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 01.11.2012, 14:31
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

можно попробовать в каком-то редакторе и пересоздать индекс
не каждый редактор такое сделает ... нужно пробовать
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
Этот пользователь сказал Спасибо Yurk@ за это полезное сообщение:
Lilu-MAKS (02.11.2012)
  #17  
Старый 01.11.2012, 15:00
Lilu-MAKS Lilu-MAKS вне форума
Прохожий
 
Регистрация: 02.11.2011
Сообщения: 16
Репутация: 10
По умолчанию

ну нету у меня mdb БД у меня есть папку как к ней подключится в ADO а?
Ответить с цитированием
  #18  
Старый 01.11.2012, 15:02
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Lilu-MAKS
ну нету у меня mdb БД у меня есть папку как к ней подключится в ADO а?
Пример >>здесь<<.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Lilu-MAKS (02.11.2012)
  #19  
Старый 01.11.2012, 15:40
Lilu-MAKS Lilu-MAKS вне форума
Прохожий
 
Регистрация: 02.11.2011
Сообщения: 16
Репутация: 10
По умолчанию

в процедуре удаления индекса он у меня на Errorio ругается! что там?
Ответить с цитированием
  #20  
Старый 01.11.2012, 16:40
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Вместо провайдера JET ещё можно попробовать провайдер MSDASQL (он в TADOConnection по-умолчанию выбран).
А ещё можно отдельно установить родной провайдер для Visual FoxPro (VFPOLEDB). Скачать его можно с сайта Microsoft.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Lilu-MAKS (02.11.2012)
  #21  
Старый 03.11.2012, 21:05
timondrik timondrik вне форума
Прохожий
 
Регистрация: 12.03.2009
Сообщения: 21
Репутация: -122
По умолчанию

Всем привет! У меня тоже проблема связаная с DBF, а точнее с запросом на выборку.
Код:
dm.qry1.SQL.Add('SELECT * FROM 60000324');
dm.qry1.SQL.Add('WHERE codvr="'+codvr+'" AND curebeg="'+curebeg+'"');
dm.qry1.Open;
Программа выдает ошибку:
Код:
Operator/operand type mismatch
Но если убрать последнее условие фильтрации:
Код:
 AND curebeg="'+curebeg+'"
то программа на ура выполнит свою задачу. С DBF редко работаю, по этому ошибка сбила с толку. Использовал ODBC FoxPro. Объясните пожалуйста кому не сложно в чем проблема.
Ответить с цитированием
  #22  
Старый 04.11.2012, 03:56
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от timondrik
Всем привет! У меня тоже проблема связаная с DBF, а точнее с запросом на выборку.
Код:
dm.qry1.SQL.Add('SELECT * FROM 60000324');
dm.qry1.SQL.Add('WHERE codvr="'+codvr+'" AND curebeg="'+curebeg+'"');
dm.qry1.Open;
Программа выдает ошибку:
Код:
Operator/operand type mismatch
Но если убрать последнее условие фильтрации:
Код:
 AND curebeg="'+curebeg+'"
то программа на ура выполнит свою задачу. С DBF редко работаю, по этому ошибка сбила с толку. Использовал ODBC FoxPro.
Какого типа поле "curebeg"?
Что содержится в переменной "curebeg"?
Ты делаешь очистку старого запроса перед добавлением нового?:
Код:
dm.qry1.SQL.Clear;
Попробуй заменить кавычки на апостроф:
Код:
  // Вот так:
  dm.qry1.SQL.Add('WHERE codvr='''+codvr+''' AND curebeg='''+curebeg+'''');

  // Или лучше так:
  dm.qry1.SQL.Add('WHERE codvr='+QuotedStr(codvr)+' AND curebeg='+QuotedStr(curebeg));

  // Или так:
  dm.qry1.SQL.Add(Format('WHERE codvr=%s AND curebeg=%s', [QuotedStr(codvr), QuotedStr(curebeg)]));
Попробуй вместо внедрения использовать параметры:
Код:
  dm.qry1.SQL.Add('WHERE codvr=:codvr AND curebeg=:curebeg');
  dm.qry1.Parameters.ParamByName('codvr').Value := codvr;
  dm.qry1.Parameters.ParamByName('curebeg').Value := curebeg;
Попробуй другой провайдер: JET или MSDASQL.
Ответить с цитированием
  #23  
Старый 04.11.2012, 13:07
timondrik timondrik вне форума
Прохожий
 
Регистрация: 12.03.2009
Сообщения: 21
Репутация: -122
По умолчанию

Цитата:
Сообщение от poli-smen
Попробуй заменить кавычки на апостроф:
Код:
  // Вот так:
  dm.qry1.SQL.Add('WHERE codvr='''+codvr+''' AND curebeg='''+curebeg+'''');

  // Или лучше так:
  dm.qry1.SQL.Add('WHERE codvr='+QuotedStr(codvr)+' AND curebeg='+QuotedStr(curebeg));

  // Или так:
  dm.qry1.SQL.Add(Format('WHERE codvr=%s AND curebeg=%s', [QuotedStr(codvr), QuotedStr(curebeg)]));
Попробуй вместо внедрения использовать параметры:
Код:
  dm.qry1.SQL.Add('WHERE codvr=:codvr AND curebeg=:curebeg');
  dm.qry1.Parameters.ParamByName('codvr').Value := codvr;
  dm.qry1.Parameters.ParamByName('curebeg').Value := curebeg;
Попробуй другой провайдер: JET или MSDASQL.
Не один вариант не помог, ошибка та же. Вот полный листинг:
Код:
procedure TForm1.btn2Click(Sender: TObject);
var
  i:Integer;
  codvr,curebeg:string;
begin
  dm.qry1.Active := True;
  pb1.Position := 0;
  pb1.Max := dm.qry1.RecordCount;
  for i:=1 to dm.qry1.RecordCount do
  begin
    codvr := dm.qry1.FieldByName('codvr').AsString;
    curebeg := dm.qry1.FieldByName('curebeg').AsString;

    if dblDoctor.Checked then
    begin
      dm.qry1.SQL.Clear;
      dm.qry1.SQL.Add('SELECT * FROM 60000324');
      dm.qry1.SQL.Add('WHERE codvr="'+codvr+'" AND curebeg="'+curebeg+'"');
      dm.qry1.Open;
      if dm.qry1.RecordCount > 1 then
      begin
        mmo1.Lines.Add(dm.qry1.FieldByName('fio').AsString+'|Дубль посещения!!!')
      end;
    end;

    pb1.Position := i;
    dm.qry1.Next;
  end;

end;
Может прояснит что нибудь. Программа должна пробежаться по базе посещений и выбрать те у которых дубли. Я так то не на профессиональном уровне программирую, по этому мог чего то не знать. Может где то, что то не правильно.
Ответить с цитированием
  #24  
Старый 04.11.2012, 15:28
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от timondrik
Не один вариант не помог, ошибка та же. Вот полный листинг:
Код:
procedure TForm1.btn2Click(Sender: TObject);
var
  i:Integer;
  codvr,curebeg:string;
begin
  dm.qry1.Active := True;
  pb1.Position := 0;
  pb1.Max := dm.qry1.RecordCount;
  for i:=1 to dm.qry1.RecordCount do
  begin
    codvr := dm.qry1.FieldByName('codvr').AsString;
    curebeg := dm.qry1.FieldByName('curebeg').AsString;

    if dblDoctor.Checked then
    begin
      dm.qry1.SQL.Clear;
      dm.qry1.SQL.Add('SELECT * FROM 60000324');
      dm.qry1.SQL.Add('WHERE codvr="'+codvr+'" AND curebeg="'+curebeg+'"');
      dm.qry1.Open;
      if dm.qry1.RecordCount > 1 then
      begin
        mmo1.Lines.Add(dm.qry1.FieldByName('fio').AsString+'|Дубль посещения!!!')
      end;
    end;

    pb1.Position := i;
    dm.qry1.Next;
  end;

end;
Может прояснит что нибудь. Программа должна пробежаться по базе посещений и выбрать те у которых дубли. Я так то не на профессиональном уровне программирую, по этому мог чего то не знать. Может где то, что то не правильно.
Это явно ошибочный код.
Обрати внимание что "dm.qry1.Active := True;" абсолютно одно и то же что и "dm.qry1.Open;"
Значит вначале ты выполняешь SQL-запрос (какой - неизвестно - тот который последним был загружен в "dm.qry1.SQL"). А потом проходишься в цикле по всем записям из этого запроса. Но внутри цикла ты используешь тот же самый qry1 для совершенно других запросов из-за чего твой цикл не может нормально продолжать выполнение.
Ответить с цитированием
  #25  
Старый 04.11.2012, 20:49
timondrik timondrik вне форума
Прохожий
 
Регистрация: 12.03.2009
Сообщения: 21
Репутация: -122
По умолчанию

Цитата:
Сообщение от poli-smen
Это явно ошибочный код.
Обрати внимание что "dm.qry1.Active := True;" абсолютно одно и то же что и "dm.qry1.Open;"
Значит вначале ты выполняешь SQL-запрос (какой - неизвестно - тот который последним был загружен в "dm.qry1.SQL"). А потом проходишься в цикле по всем записям из этого запроса. Но внутри цикла ты используешь тот же самый qry1 для совершенно других запросов из-за чего твой цикл не может нормально продолжать выполнение.
Теперь для проверки на дубляжи я сделал отдельный ADOquery, но ошибка сохранилась. При чем я заметил, что ругань именно с полем curebeg, после чего присмотрелся в навигаторе и увидет что оно типа Date, т.е. дело в типах. Но так и не могу понять как построить запрос чтобы дата воспринялась как значение типа Date.
Ответить с цитированием
  #26  
Старый 04.11.2012, 20:56
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от timondrik
Теперь для проверки на дубляжи я сделал отдельный ADOquery, но ошибка сохранилась. При чем я заметил, что ругань именно с полем curebeg, после чего присмотрелся в навигаторе и увидет что оно типа Date, т.е. дело в типах. Но так и не могу понять как построить запрос чтобы дата воспринялась как значение типа Date.
А через параметры:
Код:
dm.qry2.SQL.Add('WHERE codvr=:codvr AND curebeg=:curebeg');
dm.qry2.Parameters.ParamByName('codvr').Value := codvr;
dm.qry2.Parameters.ParamByName('curebeg').Value := StrToDateTime(curebeg);
Ответить с цитированием
  #27  
Старый 04.11.2012, 21:59
timondrik timondrik вне форума
Прохожий
 
Регистрация: 12.03.2009
Сообщения: 21
Репутация: -122
По умолчанию

Цитата:
Сообщение от poli-smen
А через параметры:
Код:
dm.qry2.SQL.Add('WHERE codvr=:codvr AND curebeg=:curebeg');
dm.qry2.Parameters.ParamByName('codvr').Value := codvr;
dm.qry2.Parameters.ParamByName('curebeg').Value := StrToDateTime(curebeg);
Фффух. Ну вот теперь всё путём. Спасибо большое за помощь
Ответить с цитированием
  #28  
Старый 04.11.2012, 23:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от timondrik
Фффух. Ну вот теперь всё путём. Спасибо большое за помощь
В таком случае лучше сразу работать с этим полем как с типом Дата/Время, без преобразования его в строку, а потом опять из строки в Дата/Время:
Код:
var
.....
  curebeg: TDateTime; // Здесь сразу объявляем переменную как Дата/Время, а не строка
begin
.....
  curebeg := dm.qry1.FieldByName('curebeg').AsDateTime; // И здесь получаем значение поля как Дата/Время, а не строка
.....
  dm.qry2.Parameters.ParamByName('curebeg').Value := curebeg; // Тогда здесь не нужно преобразовывать строку в Дата/Время

Также у меня есть подозрение, что выбрать записи "у которых дубли" можно одним единственным запросом. Правда я не могу сказать каким, так как ты не показывал текст первого запроса.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter