Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
Провайдер VFPOLEDB.1
Есть таблица
дата
время1
время2
номер
флаг1
флаг2

Есть старая программа котрая пишет данные в этот файл.
алгоритм такой
если есть время1 то я переношу из А в базу Б и ставлю в А флаг1
затем проходит некоторое время и в базу добавляется данные
снова запрос к А появилось время2 мне нужно перенести в базу 2 это время и обновить флаг2 в базе А
Но тут начинаются фокусы update не обновляет флаг 2
Я делаю точно такой же select и он мнн возвращает строку (которую должен обновить update)
если сделать реконект то update отрабатывает успешно

Еще заметил что если работать на лок машине то работеет сразу а если по сети то такая ошибка
если у когто есть идеи то могу выстать исходники и прочее
для связи
скайп tigr1234
ася ICQ#: 320-006-278
14 авг 08, 13:04    [6066671]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
проходящий.
Guest
tigr1945
Но тут начинаются фокусы update не обновляет флаг 2

Это такое сообщение об ошибке? А на какую команду? А по aerror что получено?
14 авг 08, 13:10    [6066714]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
ни каких сообщений нет просто update не отрабатывает т.е он не обновляет записи
14 авг 08, 13:32    [6066910]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
проходящий.
Guest
tigr1945
ни каких сообщений нет просто update не отрабатывает т.е он не обновляет записи

А что насчет Aerror(). Как проверялось "необновление"?
14 авг 08, 13:33    [6066918]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
Проверял dbviev тоесть. и другой програмоой ничего не обновляет
14 авг 08, 15:48    [6067911]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
Вобщем в продолжение если я использую провайдера
Provider=VFPOLEDB.1 не обновляет запись как писалось раньше
если
Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\mydbpath;
работает но медленно
У таблицы есть индекс CDX

Мне кажется что не используется индексы

База фокспро 2,6
18 авг 08, 16:44    [6079535]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Взято отсюда

How to: Access Visual FoxPro Data in Visual Studio

VFP9

oConn = CREATEOBJECT("ADODB.Connection")
oConn.ConnectionString = "provider=vfpoledb.1;data source=.\MyTestDatabase.dbc"
oConn.Open

...

A connection string includes the following attribute keywords and values:

Provider= cVFPOLEDBProvider

Specifies the Visual FoxPro OLE DB Provider (VFPOLEDB).


Data Source= cPath

Specifies the path to the Visual FoxPro database or a folder containing free tables. For example, c:\Microsoft Visual FoxPro\Samples\Data\Testdata.dbc


DSN= cDSNName

Specifies an existing ODBC DSN.


Mode= cMode

Specifies one of the following: Read, ReadWrite, Share Deny None (default), Share Deny Read, Share Deny Write, or Share Exclusive, which includes the previous two modes.

Обрати внимание на 4 параметр строки подключения. Он определяет, можно ли вносить изменения или доступ только на чтение. Какое значение использовал у себя?
18 авг 08, 17:34    [6079922]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
Provider=VFPOLEDB.1;Data Source=\\server_k\base;Mode=ReadWrite;Password="";Collating Sequence=MACHINE
Вот в таком виде у меня не работает.
Вернее получается так что упдайт не отрабатывает если делаю реконект то запрос работает,
если ставлю

Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=d:\base"

то работает но медленно
18 авг 08, 17:37    [6079952]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
Provider=VFPOLEDB.1;Data Source=\\server_k\base;Mode=ReadWrite;Password="";Collating Sequence=MACHINE

вот как было
18 авг 08, 17:40    [6079982]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
tigr1945
Provider=VFPOLEDB.1;Data Source=\\server_k\base;Mode=ReadWrite;Password="";Collating Sequence=MACHINE
Вот в таком виде у меня не работает.
Вернее получается так что упдайт не отрабатывает если делаю реконект то запрос работает,
если ставлю

Как мне кажется, ты что-то еще делаешь. Ведь реквизиты соединения можно менять после его установки.

Раз реконнект помогает, значит, ты сделал какие-то дополнительные настройки между первоначальной устновкой соединения и подачей команды на модификацию.

Сделай тестовый пример: установи соединение и сразу дай команду UPDATE.

tigr1945
Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=d:\base"

то работает но медленно

Это слишком старый драйвер. Предназначен для свободных таблиц. И вообще, есть серьезный риск как повредить файлы DBF, так и рассинхронизировать индексный файл и файл DBF. Т.е. ты модификацию сделаешь, а рабочее приложение их "не увидит" или вообще откажется работать.
18 авг 08, 18:10    [6080228]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
Если не сложно стукни в аське
320-006-278
скайп tigr1234
или скажи как связаться с тобой,

у меня получается что
я первый раз запустил у меня вычетала прога 1 сроку в базу В
в базу А я пометил что перенес время 1
затем 2 програма вписывает время 2
я снова делаю запрос (на одном и томже сооединении)
у меня показывает что меремя добавило, я переношу время 2 В базу В (обновляю запись это работает)
и мене нужно обновить флаг времени 2 в базе А но запрос отрабатывает
18 авг 08, 18:32    [6080354]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
и не обновляет флаг, делаю в этомже адоквери точно с такими же параметрами select он мне возвращает 1 запись по логики он должен и обновить ее. но этого не происходит.
делал уже просто запрос
типа
select * from otm where tn=12525 and time_o=7.30 and time_i=7.03 and date={08.08.2008}
update otm set flag_out=1 where date={08.08.2008} and time_i=7.03 and time_o=7.30
разницы нет но не обновляет
18 авг 08, 18:36    [6080367]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
tigr1945
Если не сложно стукни в аське
320-006-278
скайп tigr1234
или скажи как связаться с тобой,

Только в форуме

tigr1945

у меня получается что
я первый раз запустил у меня вычетала прога 1 сроку в базу В
в базу А я пометил что перенес время 1
затем 2 програма вписывает время 2
я снова делаю запрос (на одном и томже сооединении)
у меня показывает что меремя добавило, я переношу время 2 В базу В (обновляю запись это работает)
и мене нужно обновить флаг времени 2 в базе А но запрос отрабатывает

Под термином "время" что подразумевается? Тип DateTime или просто Date или отдельно Date и отдельно Time? Какой тип данных у Time?

Можешь написать здесь команду UPDATE полностью?


tigr1945
делал уже просто запрос
типа

select * from otm where tn=12525 and time_o=7.30 and time_i=7.03 and date={08.08.2008}
update otm set flag_out=1 where date={08.08.2008} and time_i=7.03 and time_o=7.30

разницы нет но не обновляет

Попробуй использовать синтаксис константы типа Date, не зависящий от настройки SET DATE. Это формат вида {^YYYY-MM-DD}. В качестве разделителей можно использовать наклонную черту, дефис или точку. Без разницы. Т.е. получится запрос вида:

update otm set flag_out=1 where date={^2008-08-08} and time_i=7.03 and time_o=7.30

Если поля time_i и time_o - это поля типа Numeric, то попробуй еще такой синтаксис

update otm set flag_out=1 where date={^2008-08-08} and time_i=ROUND(7.03,2) and time_o=ROUND(7.30,2)
18 авг 08, 19:08    [6080480]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
мне кажется что синтаксис тут в норме
time_in time_out нумерик в базе

upd_client(bool time_out,bool time_in,float t_i,float t_o,int tn,AnsiString dd)
{
AnsiString sql_txt="";
sql_txt="update otm set ";
if(time_in)
sql_txt =sql_txt+" flag_in=1, ";
else
sql_txt =sql_txt+" flag_in=0, ";
if(time_out)
sql_txt =sql_txt+" flag_out=1 ";
else
sql_txt =sql_txt+" flag_out=0 ";

if(flag_import) // если вставляем из импорта
sql_txt =sql_txt+", flag_imp=1 ";

sql_txt=sql_txt+" where tn="+ IntToStr(tn)+" and date=:dd1 ";




if(time_in)
sql_txt=sql_txt+" and time_i=:tin";
if(time_out)
sql_txt=sql_txt+" and time_o=:tout ";


Mod->ClientFlags->Close();
Mod->ClientFlags->SQL->Clear();
Mod->ClientFlags->SQL->Add(sql_txt);

Mod->ClientFlags->Parameters->ParamByName("dd1")->DataType =ftDateTime;
Mod->ClientFlags->Parameters->ParamByName("dd1")->Value =dd;


if(time_in)
{
Mod->ClientFlags->Parameters->ParamByName("tin")->Value =Mod->GetData->Fields->FieldByName("time_i")->Value;
// Mod->ClientFlags->Parameters->ParamByName("tin")->Value = t_i;


}
if(time_out)
{
Mod->ClientFlags->Parameters->ParamByName("tout")->Value =Mod->GetData->Fields->FieldByName("time_o")->Value;
}

Mod->ClientFlags->ExecSQL();
return true;
}
18 авг 08, 19:31    [6080535]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
Просто не может 1 и тотже код рабоать по пазному ведь после реконекта отрпбатывает обновления флага 2
18 авг 08, 19:39    [6080563]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Непосредственно перед ExecSQL() я бы проверил как строку запроса, так и записанные значения параметров. В трассировке. Т.е. не предположения типа "там должно быть", а что есть на самом деле. Не получается ли так, что передаются не те параметры или не совсем та срока запроса?

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

Кстати, реконнект делается в этой же процедуре или в другой? А вариант с последовательным Select + Update как делал? В одной и той же процедуре или две разных?
18 авг 08, 20:19    [6080666]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
да проверял в дебагере все тоже самое.
делал и с параметрами, и просто запрос тот который я приводил.
результат один и тотже.
18 авг 08, 20:49    [6080751]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
просто на форме, функция
  Form1->Cursor=crSQLWait;
   if(flag_con)
 {
   //Kon_serv->Caption="Старт";
    end_con();
    prn_log("Соединение прерванно",false,2);
 }
 else
 {
  // Kon_serv->Caption="Стоп";

   Mod->Server->ConnectionString="FILE NAME="+path+"\/server.udl";
  // Mod->Server->ConnectionString="FILE NAME="+path+"\/import.udl";
   Mod->Client->ConnectionString="FILE NAME="+path+"\/client.udl";
   Mod->Server->Connected=true;
   Mod->Client->Connected=true;
   flag_import=false;

   N7->Enabled=true;
   N8->Enabled=true;
   flag_con=true;
   N6->Caption="Стоп";
   prn_log("Соединение устанновленно",false,2);
 }
   Form1->Cursor=crDefault;
18 авг 08, 21:44    [6080869]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
 end_con()    // завершить соединение
 {
   Mod->Server->Connected=false;
   Mod->Client->Connected=false;
   Mod->Import->Connected=false;
   flag_con=false;
   Form1->Timer1->Enabled=false;
   flag_import=false;
   Form1->N7->Enabled=false;
   Form1->N8->Enabled=false;
   Form1->N7->Caption="Копия автоматом";
   Form1->N7->Checked=false;
   Form1->N6->Caption="Старт";
   Form1->StatusBar1->Visible=false;
   return true;
 }

18 авг 08, 21:45    [6080876]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Если просто установить задержку перед последним Update (не менее 5 секунд) обновление проходит?
19 авг 08, 11:56    [6082452]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
Попробывал, все по прежнему.
А вообще эта функция работала. но что я наделал понять не могу.
Или ПК, или мои руки
19 авг 08, 12:15    [6082621]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Насколько я вижу, у теб 3 соединения. Не перепутал случайно на последнем Update?
19 авг 08, 12:17    [6082643]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
вобщем заметил еще одно если в на одном квери выполнить сначала запрос
     AnsiString sql_txt="";
       sql_txt="update otm set flag_out=1 where date={08.08.2008} and time_i=ROUND(7.03,2) and time_o=ROUND(7.30,2)";

       Mod->ClientFlags->Close();
       Mod->ClientFlags->SQL->Clear();
       Mod->ClientFlags->SQL->Add(sql_txt);
       Mod->ClientFlags->ExecSQL();

то код отрабатывет

upd_client(bool time_out,bool time_in,float t_i,float t_o,int tn,AnsiString dd)
  {

   AnsiString sql_txt="";
         sql_txt="update otm set ";
       if(time_in)
         sql_txt =sql_txt+" flag_in=1, ";
         else
          sql_txt =sql_txt+" flag_in=0, ";
       if(time_out)
          sql_txt =sql_txt+" flag_out=1 ";
          else
            sql_txt =sql_txt+" flag_out=0 ";

       if(flag_import) // åñëè âñòàâëÿåì èç èìïîðòà
           sql_txt =sql_txt+", flag_imp=1 ";

       sql_txt=sql_txt+" where tn="+ IntToStr(tn)+" and date=:dd1 ";
       if(time_in)
        sql_txt=sql_txt+" and time_i=:tin";
       if(time_out)
       sql_txt=sql_txt+" and time_o=:tout ";


       Mod->ClientFlags->Close();
       Mod->ClientFlags->SQL->Clear();
       Mod->ClientFlags->SQL->Add(sql_txt);

     Mod->ClientFlags->Parameters->ParamByName("dd1")->DataType =ftDateTime;
     Mod->ClientFlags->Parameters->ParamByName("dd1")->Value  =dd;

       if(time_in)
     {
     Mod->ClientFlags->Parameters->ParamByName("tin")->Value  =Mod->GetData->Fields->FieldByName("time_i")->Value;
     // Mod->ClientFlags->Parameters->ParamByName("tin")->Value  = t_i;


     }
     if(time_out)
     {
       Mod->ClientFlags->Parameters->ParamByName("tout")->DataType=ftFloat;
       Mod->ClientFlags->Parameters->ParamByName("tout")->NumericScale=2;
       Mod->ClientFlags->Parameters->ParamByName("tout")->Value  =Mod->GetData->Fields->FieldByName("time_o")->AsFloat;
     }

       Mod->ClientFlags->ExecSQL();
       return true;
  }



Получается что чтото остается в запросе что мешает что бы он нормально отрабатывал
19 авг 08, 12:45    [6082870]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
может мне нужно обновить билдер, может какието проблемы с виндой. Сейчас попробую винду преставить
27 авг 08, 09:32    [6113109]     Ответить | Цитировать Сообщить модератору
 Re: с++builder foxpro  [new]
tigr1945
Member

Откуда:
Сообщений: 20
Добрый день вообщем так все проблема и осталась.
если ктото поможет готов заплатить за помощь
http://tigr1945.jino.ru/zend.rar файл проекта
ICQ#: 32000627(восем)
1 сен 08, 12:19    [6131250]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить