Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2011, 21:58   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Провайдера OLE DB Provider for Visual FoxPro под рукой нет, попробовал JET OLE DB с командной строкой
Provider=Microsoft.Jet.OLEDB.4.0;Da ta Source=e:\dbf\;Mode=Read;Extended Properties=DBASE IV;Persist Security Info=False
запросы типа "SELECT * FROM NAZ_ALL" и "SELECT * FROM WM" съел без проблем, кодировка тоже в порядке, запросы от Сержа ни в какую - не понимает функций FOXPRO. А написать программу по сканированию данных в дельфях по двум полученным таблицам проблема?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.10.2011, 08:41   #12
AlexFBG
 
Регистрация: 29.09.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А написать программу по сканированию данных в дельфях по двум полученным таблицам проблема?
Изначально думал, что так и придется сделать, а как реализовать не доходит. Алгоритм примерно такой себе представляю: создать переменную, присвоить ей значание запись1 таблицы, поля -фамилия+имя+отчество+год рождения, проверяем наличие переменной в записях второй таблицы, если нет - записываем значение переменной в файл, обнуляем переменную, переходим к следующей записи в таблице№1. Таким образом определяется вхождение таб1 в таб2, потом меняем таблицы местами и находим вхождение таб2 в таб1. Все понимаю а как на Delphi реализовать? Есть ли варианты проще? Устанавливать Fox не желательно для меня.
AlexFBG вне форума Ответить с цитированием
Старый 01.10.2011, 11:29   #13
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Вроде бы можно и так: обычное соединение с помощью ADO и выполняем запрос
Цитата:
SELECT * FROM naz_all a LEFT OUTER JOIN wm b ON
UCASE(TRIM(TRIM(TRIM(a.FM) + ' ' + a.IM) + ' ' + a.OT)) + ' ' + Str(a.DTR) = b.PERSONOUID
Одно условие
Цитата:
WHERE NOT b.PERSONOUID IS NULL
Другое условие
Цитата:
WHERE b.PERSONOUID IS NULL
ReportCube вне форума Ответить с цитированием
Старый 01.10.2011, 12:31   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

На дельфях простенько набросал, можно за основу взять
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ADODB, StrUtils, DB;

type
  TForm1 = class(TForm)
    ADOQueryWM: TADOQuery;
    ADOQueryNA: TADOQuery;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var xList: TStringList;
    s,xFm,xIm,xOt: String;
    i,j: Integer;
    xDtr: TDateTime;
    xFind: Boolean;
function ParsePersonouid(Personouid: String): Boolean;
begin
  Result:=False;
  s:=Trim(Personouid);
  j:=1;
  i:=PosEx(' ',s,j);
  if i=0 then Exit;
  xFm:=Copy(s,j,i-j);
  j:=i+1;
  i:=PosEx(' ',s,j);
  if i=0 then Exit;
  xIm:=Copy(s,j,i-j);
  j:=i+1;
  i:=PosEx(' ',s,j);
  if i=0 then Exit;
  xOt:=Copy(s,j,i-j);
  j:=i+1;
  try
    xDtr:=StrToDate(Copy(s,j,Length(s)-j+1));
  except
    Exit;
  end;
  Result:=True;
end;
begin
  DateSeparator:='.';
  ShortDateFormat:='dd/mm/yyyy';

  ADOQueryWM.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\dbf\;Mode=Read;Extended Properties=DBASE IV;Persist Security Info=False';
  ADOQueryWM.SQL.Text:='SELECT * FROM WM';
  ADOQueryWM.Active:=True;

  ADOQueryNA.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\dbf\;Mode=Read;Extended Properties=DBASE IV;Persist Security Info=False';
  ADOQueryNA.SQL.Text:='SELECT * FROM NAZ_ALL ORDER BY FM,IM,OT,DTR';
  ADOQueryNA.Active:=True;

  xList:=TStringList.Create;
  xList.Add('Записи WM не найденные в NAZ_ALL');
  ADOQueryWM.First;
  while not ADOQueryWM.Eof do begin
    xFind:=ParsePersonouid(ADOQueryWM.FieldByName('Personouid').AsString) and
           ADOQueryNA.Locate('FM;IM;OT',VarArrayOf([xFm,xIm,xOt]),[loCaseInsensitive]);
    if xFind and (ADOQueryNA.FieldByName('DTR').AsDateTime<>xDtr) then begin
      xFind:=False;
      while not ADOQueryNA.Eof and
            AnsiSameText(ADOQueryNA.FieldByName('FM').AsString,xFm) and
            AnsiSameText(ADOQueryNA.FieldByName('IM').AsString,xIm) and
            AnsiSameText(ADOQueryNA.FieldByName('OT').AsString,xOt) do begin
        xFind:=ADOQueryNA.FieldByName('DTR').AsDateTime=xDtr;
        if xFind then Break;
        ADOQueryNA.Next;
      end;
    end;
    if not xFind then xList.Add(ADOQueryWM.FieldByName('Personouid').AsString);
    ADOQueryWM.Next;
  end;

  xList.Add('');
  xList.Add('Записи NAZ_ALL не найденные в WM');
  ADOQueryNA.First;
  while not ADOQueryNA.Eof do begin
    s:=ADOQueryNA.FieldByName('FM').AsString+' '+
       ADOQueryNA.FieldByName('IM').AsString+' '+
       ADOQueryNA.FieldByName('OT').AsString+' '+
       FormatDateTime('dd.mm.yyyy',ADOQueryNA.FieldByName('DTR').AsDateTime);
    if not ADOQueryWM.Locate('Personouid',s,[loCaseInsensitive]) then xList.Add(s);
    ADOQueryNA.Next;
  end;

  xList.SaveToFile('e:\dbf\Protokol.txt');
  xList.Free;
  ADOQueryWM.Active:=False;
  ADOQueryNA.Active:=False;
end;

end.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 01.10.2011 в 12:39.
Аватар вне форума Ответить с цитированием
Старый 01.10.2011, 13:33   #15
AlexFBG
 
Регистрация: 29.09.2011
Сообщений: 8
По умолчанию

Выдает ошибку: File ucase.prg does not exist. Поставщик данных MS OLE DB Provider for Visual FoxPro.
AlexFBG вне форума Ответить с цитированием
Старый 01.10.2011, 13:54   #16
AlexFBG
 
Регистрация: 29.09.2011
Сообщений: 8
По умолчанию

Аватар, огромное спасибо, все получилось. Даже не надо Provider for Visual FoxPro! Дороботаю интерфейс и поделюсь с коллегами, права на алгоритм твой.
AlexFBG вне форума Ответить с цитированием
Старый 01.10.2011, 16:53   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

AlexFBG не забудь восстановить значения DateSeparator и ShortDateFormat если код будешь в проект встраивать. Ну и обработку исключений не мешало бы в код вставить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.05.2014, 11:53   #18
antonon82
Новичок
Джуниор
 
Регистрация: 13.05.2014
Сообщений: 3
По умолчанию

Помогите пожалуйста сравнить 2 dbf файла и сохранить в dbf
antonon82 вне форума Ответить с цитированием
Старый 13.05.2014, 12:03   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
antonon82
Во-первых: Не лезь в чужую тему.
Во-вторых: Может стоит выложить файлы?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.05.2014, 13:30   #20
antonon82
Новичок
Джуниор
 
Регистрация: 13.05.2014
Сообщений: 3
По умолчанию

Как тут написать в личные сообщения?
antonon82 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт в БД Access dbf файлов через Delphi AndreyCY БД в Delphi 3 18.07.2011 19:33
dbf и tqueru, собрать несколько dbf файлов в одном, импорт вобщем betirsolt БД в Delphi 16 10.07.2011 13:52
Отправка файлов в .dbf формате Nikolay88 БД в Delphi 2 03.03.2011 04:26
Сравнение таблицы в Oracle с DBF Shanya БД в Delphi 1 12.05.2008 14:23