[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: перевод или синхронизация новых данных из dbf табл
Alex73
Дорый день .Прошу помащи .Есть ДБ "BIBLIO DATEN" в формате dbf (который расположен на компе у библеотекера) и есть ДБ "BIBLIO DATEN" в MySQL на сервере организации. Задача в том ,что нужно новые данные перебрасывать из ДБ "BIBLIO DATEN"-dbf в ДБ "BIBLIO DATEN" в MySQL.Передача должна происходить автоматичиски или по завершению работы ДБ "BIBLIO DATEN"-dbf .
С чего начть и в каком мапровлении двигатся не знаю .Если есть идеи и как их реализовать ,то прошу помочь.



Спустя 13 минут, 59 секунд (11.02.2009 - 15:13) sergeiss написал(а):
Вот не поверишь... Но подобную задачу я недавно решал smile.gif Только не с библиотеками связано, но чисто технически - именно оно.

Я сделал прогу на Си, которая работает локально. По запросу юзера формируются данные (из таблиц DBase), которые выкладываются на сетевой диск. Этот же сетевой диск одновременно является локальным для того компа, где расположен корпоративный вэб-сервер.
Затем локальная прога вызывает скрипт на сервере. А сервер знает, где ему (локально относительно него) брать данные. И они грузятся в нормальную БД, в моем случае PostgreSQL.

Спустя 3 часа, 14 минут, 33 секунды (11.02.2009 - 18:28) Alchemist написал(а):
"И что только люди не выдумают, чтобы не ездить на картошку..." (с) smile.gif

Спустя 4 часа, 36 минут, 22 секунды (11.02.2009 - 23:04) sergeiss написал(а):
Цитата (Alchemist @ 11.02.2009 - 18:28)
"И что только люди не выдумают, чтобы не ездить на картошку..." (с) smile.gif

Э..... Не понял коммент...

Спустя 17 часов, 5 минут, 22 секунды (12.02.2009 - 16:09) Alchemist написал(а):
Мюллер вызывает офицеров: - Господа! Завтра едем на картошку?
Штирлиц радостно: - Ой, совсем как у нас!
А потом подумал: мать честная, что же я наделал! Засыпался!
И решил покаяться.
Исписал двадцать страниц, что он разведчик, какие задания выполнял, в каких операциях участвовал.
Мюллер читал, читал: - И чего только не придумают, чтобы на картошку не ехать!

Спустя 10 минут, 36 секунд (12.02.2009 - 16:20) sergeiss написал(а):
Все равно не понял, при чем тут этот анекдот smile.gif

А по теме - и что поделаешь, ежели есть локально работающая прога, которая использует таблицы Парадокс, отлаженная, и сделанная в другом подразделении компании, но обрабатывающая наши данные? А обработанные данные из нее надо брать и запихивать на сервер. Вот и приходится изворачиваться. Потому что если я буду делать обработчик вместо той проги, то я на пол-года (минимум!) в этом погрязну smile.gif А оно мне надо? Хотя, конечно, придется потом это делать.

Спустя 19 часов, 28 минут, 52 секунды (13.02.2009 - 11:49) Alex73 написал(а):
Привет sergeiss .Если можно то покажите исходник или скипт с кодом.

Спустя 22 минуты, 48 секунд (13.02.2009 - 12:12) sergeiss написал(а):
Цитата (Alex73 @ 13.02.2009 - 11:49)
Привет sergeiss .Если можно то покажите исходник или скипт с кодом.

Показать-то я могу... Но та часть, которая выгребает данные из DBase и складирует их в отдельный файл, сделана на Си. Сделано это было по той причине, чтобы на клиенте не надо было устанавливать ни Апач, ни другие серверы. А только один экзешник, да BDE.

На PHP только загрузка этого файла в БД, буквально одна команда.

Спустя 36 минут, 8 секунд (13.02.2009 - 12:48) Alex73 написал(а):
Супер . если есть возможность скинь .Просто ситуация похожая на твою.

Спустя 1 час, 42 минуты, 23 секунды (13.02.2009 - 14:30) sergeiss написал(а):
Ну, если ты так хочешь... Разбирайся. Но помни: ты сам этого хотел smile.gif

Комментарии я не писал, только самый минимум, т.к. код делал только для себя.

Имена полей в DBase и в нормальной БД (PostgreSQL) совпадают.

1. Функция подготовки и загрузки одного блока данных.
Код
void __fastcall TMainForm::LoadAlc( AnsiString Date_ )
{
Query->Active=false;
Query->DatabaseName=PathAlc+"\\REG";

MemoLoad->Lines->Add( "Загрузка данных по Алкателю." );
// сначала - загрузка данных по GSM
Query->SQL->Text="select "
" data as date_, reg as bsc_name, h, mc01, mc02, mc04, mc07, mc137, mc138, mc148, mc14c, "
"mc15a, mc15b, mc380a, mc380b, mc541a, mc551, mc561, mc621, mc701e, mc702a, "
"mc702b, mc702c, mc703, mc704a, mc704b, mc712, mc717a, mc717b, mc718, mc736, "
"mc739, mc812, mc921c "

"from '"+PathAlc+"\\REG\\StBTS.db' "
// выбрать все данные за определенный день
"where data='"+Date_+"' "
" and h=24 and reg<>'MSC' and reg <> 'NET' and reg<>'MREG' and "
"reg<>'REG' and reg<>'-'";

LoadDataPrepaired( Query, "Alcatel gsm", "alc_gsm" );

Query->SQL->Text="select "

"g2.data as date_, g2.h, g2.reg as bsc_name, g2.cell, g2.p438c, "
"g2.p55a, g2.p55b, g2.p55c, g2.p55d, g2.p55e, g2.p55f, "
"g2.p55g, g2.p55h, g2.p55i, g2.p55j, g2.p55k, g2.p55l, g2.p55m, "
"g2.p57a, g2.p57b, g2.p57c, g2.p57d, g2.p57e, g2.p57f, "
"g2.p57g, g2.p57h, g2.p57i, g2.p57j, g2.p57k, g2.p57l, g2.p57m, "
"g2.p62a, g2.p62b, g2.p62c, g2.p90a, g2.p90b, g2.p90c, g2.p90d, "
"g2.p90e, g2.p90f, g2.p91a, g2.p91b, g2.p91c, g2.p91d, g2.p91e, g2.p91f, "
"g1.p30a, g1.p30b, g1.p30c "
"from '"+PathAlc+"\\REG\\StGPRS1.db' g1, '"+PathAlc+"\\REG\\StGPRS2.db' g2 "+
"where data='"+Date_+"' and g1.data=g2.data "+
"and g2.h=24 and g1.h=g2.h and g2.reg<>'MSC' and g2.reg <> 'NET' and "
"g2.reg<>'MREG' and g2.reg<>'REG' and g2.reg<>'-' and g1.reg=g2.reg";

LoadDataPrepaired( Query, "Alcatel grps", "alc_gprs" );
MemoLoad->Lines->Add( "Загрузка данных по Алкателю завершена." );
}


2. Функция, используемая непосредственно для выгрузки в файл.

Код
void __fastcall TMainForm::LoadDataPrepaired(
TQuery *CurrQuery, AnsiString ProducerName, AnsiString FName )
{
AnsiString FileName;
AnsiString TitleString, OneString;
FILE *out;

FileName=FName+"_info.txt";

try // сделать запрос
{
 CurrQuery->Active=true;
}
catch( Exception &exc )
{
 MemoLoad->Lines->Add( "Ошибка при запросе данных в БД, "+ProducerName+
  ": '"+ exc.Message+"'");
 CurrQuery->Active=false;
 return;
}


try // открыть файл для записи данных
{
 if( (out=fopen( (ServerPath+"\\"+FileName).c_str(), "wt")) == NULL )
 {
  MemoLoad->Lines->Add( "Ошибка открытия файла для записи заголовка, "+
   ProducerName );
  CurrQuery->Active=false;
  return;
 }

}
catch( Exception &exc )
{
 MemoLoad->Lines->Add( "Ошибка открытия файла для записи заголовка, "+
  ProducerName+" : '"+
  exc.Message+ "'" );
 CurrQuery->Active=false;
 return;
}

// сначала создаем и сохраняем заголовок
for( int i=0; i<Query->Fields->Count; i++)
{
 if( i>0 )
  TitleString += ", ";
 TitleString += Query->Fields->Fields[i]->FieldName;
}

fputs( (TitleString+"\n").c_str(), out );

// а затем сохраняем данные
for( CurrQuery->First(); !CurrQuery->Eof; CurrQuery->Next() )
{
 OneString="";
 for( int i=0; i<CurrQuery->Fields->Count; i++)
 {
  if( i>0 )
   OneString += ",";
  if( CurrQuery->Fields->Fields[i]->DataType == ftString ||
   CurrQuery->Fields->Fields[i]->DataType == ftDate )
   OneString += "'"+CurrQuery->Fields->Fields[i]->AsString+"'";
  else
   OneString += CurrQuery->Fields->Fields[i]->AsString;
 }
 fputs( (OneString+"\n").c_str(), out );
}

fclose( out );

} // конец функции LoadDataPrepaired


3. Функция запуска скрипта

Код
void __fastcall TMainForm::ButtonLoadClick(TObject *Sender)
{
if( Busy )
 return;
Busy=true;

ButtonCheck->Enabled=false;
ButtonLoad->Enabled=false;
// тут - основная часть по загрузке на сайт - вызов скрипта на сервере.
AnsiString Cmd, Param;

Cmd="c:\\rms_stat\\batch\\load_stat_day.bat";
if( Long_week->Checked )
 Param="?period";
else
 Param="?day";

MemoLoad->Lines->Add( "Command to send: "+Cmd );

 if( spawnl( P_NOWAIT, Cmd.c_str(), Cmd.c_str(), Param.c_str(), NULL) != 0 )
{
 MemoLoad->Lines->Add ( "Всё загружено!" );
 MemoLoad->Lines->Add ( "" );
 MemoLoad->Lines->Add ( "" );
}
else
{
 MemoLoad->Lines->Add ( "Ошибка запуска загрузки данных на сервер." );
 switch( errno )
 {
  case E2BIG: MemoLoad->Lines->Add( "Arg list too long" ); break;
  case EINVAL: MemoLoad->Lines->Add( "Invalid argument" ); break;
  case ENOENT: MemoLoad->Lines->Add( "Path or file name not found" ); break;
  case ENOEXEC: MemoLoad->Lines->Add( "Exec format error" ); break;
  case ENOMEM: MemoLoad->Lines->Add( "Not enough memory" ); break;
 }
}

ButtonCheck->Enabled=true;
Busy=false;
}

Указанный тут "батник" вызывает Интернет Эксплорер, и указывает ему, какой скрипт, с какого сервера, и с какими параметрами ему надо вызвать.

4. Основная часть скрипа на PHP, загружающая данные.

PHP
// сначала всякие подготовительные процедуры, в т.ч. подключение БД

// функция загрузки одного файла
function LoadOneStatFile( $fname, $table )
{
    $in=fopen( $fname, "rt");
    if( $in == false )
    {
        echo "Ошибка открытия файла $fname для загрузки данных...";
        return false;
    }
    else
        echo 
"Файл $fname благополучно открыт...";
    
    $title
=fgets( $in, 4000 ); // заголовок из файла
    
    fclose
( $in );
    
    if
( strlen( $title ) > 0 ) 
    
{
        $sql="copy $table ($title) from '$fname' with csv header quote ''''";
        $query=@pg_query( $sql );
        if( !$query )
        {
            echo "Ошибка загрузки файла $fname в таблицу $table.<br>";
            echo "SQL=$sql<br>";
            return false;
        }
    }
    else
         return false
;

    return true;
}
 // end of function LoadOneStatFile


echo "Время запуска ".date( "Y-m-d, H:i:s" )."<br>";

$errors=0;
echo "Загрузка части 1 :<br>";
if(
 LoadOneStatFile( "c:/rms_stat/tmp/ini/alc_gsm_info.txt", "stat_gsm_alc") )
    echo "часть 1 загружена<br>";
else
{
    echo "часть 1 не загружена<br>";
    $errors++;
}
// ну и так далее - гружу всё однотипно.

Спустя 13 минут, 12 секунд (13.02.2009 - 14:43) Alex73 написал(а):
Огромное спасибо . Тепер есть за что зацепится
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.