powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CBuilder+ODBC+БД FoxPro
9 сообщений из 9, страница 1 из 1
CBuilder+ODBC+БД FoxPro
    #35590302
leksu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Имеется БД на FoxPro 9.
Я пытаюсь с ней работать на CBuilder через ODBC.
запросы select работают нормально.
а вот Insert и Update выдают ошибку [Microsoft][ODBC Visual FoxPro Driver] Trigger Failed.
а на Delete [Microsoft][ODBC Visual FoxPro Driver] Unsupported function in rule or trigger.
Поставил себе FoxPro9 и посмотрел. в БД на Insert, Update и Delete имеются триггеры и Rule, при чем программа написаная на FoxPro работает со своей базой, а я не могу.
Подскажите что-нибудь.
...
Рейтинг: 0 / 0
CBuilder+ODBC+БД FoxPro
    #35590338
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите код, которым коннектитесь к провайдеру ODBC и базе.
Скоре всего, просто указаны не те режимы открытия курсора.
...
Рейтинг: 0 / 0
CBuilder+ODBC+БД FoxPro
    #35590369
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще не плохо было бы привести код самих тригеров и правил.

Скорее всего прямой insert в таблицу из фокса тоже не отработает


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
CBuilder+ODBC+БД FoxPro
    #35590492
leksu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сразу извиняюсь, не нашел как правильно оформинь приводимый код.
1.Строка подключения в ADO-компоненте
Provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;Extended Properties="Driver={Driver para o Microsoft Visual FoxPro};UID=;SourceDB=d:\sudos\dbf\data1.dbc;SourceType=DBC;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"

Я может что-то не то делаю, а может и то (первый раз). Открыл БД по таблице щелкаю мышкой и нажимаю Modify. Переключаюсь на вкладку Table и там смотрю
//-----------------------------------------------------------
2. Rule: update_rec()
* Обновление записей
Function update_rec()

If !f_archive
Replace f_archive With .T.
Endif
Return .T.

//-----------------------------------------------------------
3. Triggers
//-----------------------------------------------------------
Insert triggers: ins_trg()
* Добавление записей
Function ins_trg()

*!* IF UPPER(ALLTRIM(JUSTSTEM(DBF()))) == "PROHOD"
*!* REPLACE lock WITH REPLICATE(CHR(0), FSIZE(lock))
*!* ENDIF



If Type("m.public_bd_work_udp")=="L"
If m.public_bd_work_udp
If Type("gnFireBird")=="N" And Type("gnFireBirdDay")=="N"
Local m.tbl_
m.tbl_ = Juststem(Dbf())

Local m.fl_sql
m.fl_sql=0

If Type("m.dbf_public_global_u_id_edit")=="U"
Public m.dbf_public_global_u_id_edit
m.dbf_public_global_u_id_edit = ""
Endif
m.dbf_public_global_u_id_edit = u_id


*!* ACTIVATE SCREEN
*!* ? " I "
*!* ?? Juststem(Dbf())
*!* ?? " "
*!* *!* ?? tmp_array_obj[m.i]
*!* *!* ?? " "
*!* *!* ?? &tmp_array_obj[m.i]
*!* ?? " uid - "
*!* ?? u_id
*!* ?? " --- "
*!* ?? m.dbf_public_global_u_id_edit



If gnFireBird > 0 And gnFireBirdDay> 0
m.fl_sql=SQLExec(gnFireBird,[INSERT INTO "]+Juststem(Dbf())+[" (U_ID,NUM_REC) VALUES (?u_id,?num_rec) ])

If m.fl_sql>0
m.fl_sql=SQLExec(gnFireBirdDay,[INSERT INTO "_DAY_" ("ACTION","U_ID","NUM_REC","TABLE","IP","PRIL","UP_ID") VALUES ('I',?u_id,?num_rec,?m.tbl_,?m.public_global_my_ip,?m.public_global_pril_type,?id)])
If m.fl_sql>0
Else
=SQLDisconnect(gnFireBird)
=SQLDisconnect(gnFireBirdDay)
gnFireBird=0
gnFireBirdDay=0
=FB_day_tmp('I',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id)
Endif
Else
=SQLDisconnect(gnFireBird)
=SQLDisconnect(gnFireBirdDay)
gnFireBird=0
gnFireBirdDay=0
=FB_day_tmp('I',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id)
Endif
Else
=FB_day_tmp('I',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id)
Endif
Endif
Endif
Endif



If Type("m.global_public_flag_not_day")=="L"
If m.global_public_flag_not_day
Return
Endif
Endif


=AddToLogDBF("добавлена")
=AddTrans(Juststem(Dbf()), Recno(), "I", Dbf())


Local m.tmp_obj
Scatter Memo Name m.tmp_obj
Amembers(tmp_array_obj, m.tmp_obj )
Local m.i
For m.i = 1 To Alen(tmp_array_obj)
If Type("&tmp_array_obj[m.i]") == "N"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],&tmp_array_obj[m.i],"",.F.,"",Date(),Datetime(),u_id,id,"N")
Endif

If Type("&tmp_array_obj[m.i]") == "C"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,&tmp_array_obj[m.i],.F.,"",Date(),Datetime(),u_id,id,"C")
Endif

If Type("&tmp_array_obj[m.i]") == "L"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",&tmp_array_obj[m.i],"",Date(),Datetime(),u_id,id,"L")
Endif

If Type("&tmp_array_obj[m.i]") == "M"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,&tmp_array_obj[m.i],Date(),Datetime(),u_id,id,"M")
Endif

If Type("&tmp_array_obj[m.i]") == "D"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,"",&tmp_array_obj[m.i],Datetime(),u_id,id,"D")
Endif

If Type("&tmp_array_obj[m.i]") == "T"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,"",Date(),&tmp_array_obj[m.i],u_id,id,"T")
Endif
Endfor




Return .T.


//-----------------------------------------------------------
Update trigger: upd_trg()
* Обновление записей
Function upd_trg()


If Type("m.public_bd_work_udp")=="L"
If m.public_bd_work_udp


Local m.tmp_obj
Scatter Memo Name m.tmp_obj
Amembers(tmp_array_obj, m.tmp_obj )
Local m.i
For m.i = 1 To Alen(tmp_array_obj)

If Type("m.public_global_bd_list_not_send")=="C"
If ";"+Alltrim(Juststem(Dbf()))+"."+Alltrim(tmp_array_obj[m.i])+";"$";"+m.public_global_bd_list_not_send+";"
Loop
Endif
Endif



If !&tmp_array_obj[m.i]==Oldval(tmp_array_obj[m.i])


*!* ACTIVATE SCREEN
*!* ? Type("gnFireBird")
*!* ?? Type("gnFireBirdDay")
*!* ? gnFireBird
*!* ?? gnFireBirdDay


*!* ACTIVATE SCREEN
*!* ? " U "
*!* ?? Juststem(Dbf())
*!* ?? " "
*!* ?? tmp_array_obj[m.i]
*!* ?? " "
*!* ?? &tmp_array_obj[m.i]
*!* ?? " "
*!* ?? u_id



If Type("gnFireBird")=="N" And Type("gnFireBirdDay")=="N"
Local m.tbl_
m.tbl_ = Juststem(Dbf())

Local m.fl_sql
m.fl_sql=0

If gnFireBird > 0 And gnFireBirdDay> 0
Local m.u_id , m.tmp_var




m.u_id = u_id

If Empty(m.u_id)
If Type("m.dbf_public_global_u_id_edit")=="U"
Public m.dbf_public_global_u_id_edit
m.dbf_public_global_u_id_edit = ""
Else
m.u_id = m.dbf_public_global_u_id_edit
Endif
Endif



m.tmp_var = &tmp_array_obj[m.i]
If Type("&tmp_array_obj[m.i]") == "L"
If m.tmp_var
m.fl_sql=SQLExec(gnFireBird,[update "]+Juststem(Dbf())+[" set "]+tmp_array_obj[m.i]+[" = 1 where (U_ID = ?m.u_id) ])
Else
m.fl_sql=SQLExec(gnFireBird,[update "]+Juststem(Dbf())+[" set "]+tmp_array_obj[m.i]+[" = 0 where (U_ID = ?m.u_id) ])
Endif
Else
m.fl_sql=SQLExec(gnFireBird,[update "]+Juststem(Dbf())+[" set "]+tmp_array_obj[m.i]+[" = ?m.tmp_var where (U_ID = ?m.u_id) ])
Endif

If m.fl_sql>0
m.fl_sql=SQLExec(gnFireBirdDay,[INSERT INTO "_DAY_" ("ACTION","U_ID","NUM_REC","TABLE","IP","PRIL","POLE","UP_ID") VALUES ('U',?m.u_id,?num_rec,?m.tbl_,?m.public_global_my_ip,?m.public_global_pril_type,']+tmp_array_obj[m.i]+[',?id)])
If m.fl_sql>0
Else
=SQLDisconnect(gnFireBird)
=SQLDisconnect(gnFireBirdDay)
gnFireBird=0
gnFireBirdDay=0
=FB_day_tmp('U',m.u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,tmp_array_obj[m.i],Id)
Endif
Else
=SQLDisconnect(gnFireBird)
=SQLDisconnect(gnFireBirdDay)
gnFireBird=0
gnFireBirdDay=0
=FB_day_tmp('U',m.u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,tmp_array_obj[m.i],Id)
Endif
Else
=FB_day_tmp('U',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,tmp_array_obj[m.i],Id)
Endif
Endif
Endif
Endfor
Endif
Endif




If Type("m.global_public_flag_not_day")=="L"
If m.global_public_flag_not_day
Return
Endif
Endif


=AddToLogDBF("изменена")
*=AddTrans(JUSTSTEM(DBF()), RECNO(), "U", DBF())


Local m.tmp_obj
Scatter Memo Name m.tmp_obj
Amembers(tmp_array_obj, m.tmp_obj )
Local m.i
For m.i = 1 To Alen(tmp_array_obj)
*!* ? Oldval(tmp_array_obj[m.i])
*!* ? &tmp_array_obj[m.i]
If !&tmp_array_obj[m.i]==Oldval(tmp_array_obj[m.i])
*!* Activate Screen
*!* ? "Новое значение "
*!* ?? &tmp_array_obj[m.i]
*!* ?? " в "
*!* ?? tmp_array_obj[m.i]
*!* ?? " "
*!* ?? Recno()
*!* ?? num_rec


If Type("&tmp_array_obj[m.i]") == "N"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],&tmp_array_obj[m.i],"",.F.,"",Date(),Datetime(),u_id,id,"N")
Endif

If Type("&tmp_array_obj[m.i]") == "C"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,&tmp_array_obj[m.i],.F.,"",Date(),Datetime(),u_id,id,"C")
Endif

If Type("&tmp_array_obj[m.i]") == "L"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",&tmp_array_obj[m.i],"",Date(),Datetime(),u_id,id,"L")
Endif

If Type("&tmp_array_obj[m.i]") == "M"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,&tmp_array_obj[m.i],Date(),Datetime(),u_id,id,"M")
Endif

If Type("&tmp_array_obj[m.i]") == "D"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,"",&tmp_array_obj[m.i],Datetime(),u_id,id,"D")
Endif

If Type("&tmp_array_obj[m.i]") == "T"
=AddTrans_u(Juststem(Dbf()), Recno(), "U", Dbf(), tmp_array_obj[m.i],0,"",.F.,"",Date(),&tmp_array_obj[m.i],u_id,id,"T")
Endif


Endif
Endfor



Return .T.

//-----------------------------------------------------------
Delete trigger: del_trg()
* Удаление записей
Function Del_trg()



If Type("m.public_bd_work_udp")=="L"
If m.public_bd_work_udp


If Type("gnFireBird")=="N" And Type("gnFireBirdDay")=="N"
Local m.tbl_
m.tbl_ = Juststem(Dbf())


Local m.fl_sql
m.fl_sql=0


If gnFireBird > 0 And gnFireBirdDay> 0
Local m.u_id , m.tmp_var
m.u_id = u_id
m.tmp_var = &tmp_array_obj[m.i]

m.fl_sql=SQLExec(gnFireBird,[update "]+Juststem(Dbf())+[" set "IS_DELETED" = 1 where (U_ID = ?m.u_id) ])
If m.fl_sql>0
m.fl_sql=SQLExec(gnFireBirdDay,[INSERT INTO "_DAY_" ("ACTION","U_ID","NUM_REC","TABLE","IP","PRIL","UP_ID") VALUES ('D',?u_id,?num_rec,?m.tbl_,?m.public_global_my_ip,?m.public_global_pril_type,?id)])
If m.fl_sql>0
Else
=SQLDisconnect(gnFireBird)
=SQLDisconnect(gnFireBirdDay)
gnFireBird=0
gnFireBirdDay=0
=FB_day_tmp('D',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id)
Endif
Else
=SQLDisconnect(gnFireBird)
=SQLDisconnect(gnFireBirdDay)
gnFireBird=0
gnFireBirdDay=0
=FB_day_tmp('D',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id)
Endif
Else
=FB_day_tmp('D',u_id,num_rec,m.tbl_,m.public_global_my_ip,m.public_global_pril_type,"",Id)
Endif
Endif

Endif
Endif

If Type("m.global_public_flag_not_day")=="L"
If m.global_public_flag_not_day
Return
Endif
Endif


=AddToLogDBF("удалена")
=AddTrans(Juststem(Dbf()), Recno(), "D", Dbf(),u_id,id)
Return .T.


//-----------------------------------------------------------
...
Рейтинг: 0 / 0
CBuilder+ODBC+БД FoxPro
    #35590532
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, с Delete() ясно - даже при отсутствующей переменной public_bd_work_udp, что пропустит
почти весь триггер, нет функции AddToLogDBF()
С Insert() и Update() что-то неясно - по идее, должны бы рубиться тоже на AddToLogDBF(),
впрочем, там еще присутствует макроподстановка &tmp_array_obj[m.i] ...

Вобщем, триггеры написаны исключительно замечательно :-) Спец писАл...
...
Рейтинг: 0 / 0
CBuilder+ODBC+БД FoxPro
    #35590567
leksu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
исключительно это ИсКлЮчИтЕлЬнО?!

А мне что делать?!

Можно объяснить что не так и есть ли выход из данной ситуации?!
//---------------------------------------------------------------------------
Функция (просили?!)
Function AddToLogDBF
Lparameters m.Action
Local m.i, m.fl

If (Type("m.register_database_log") == "C") And (m.register_database_log == "Y")


*!* m.fl=.F.
*!* ADIR(dir_arr,ForcePath("*.", JustPath(DBF())), "D")
*!* FOR m.i=1 to alen(dir_arr,1)
*!* IF alltrim(upper(dir_arr[m.i,1]))=="LOGS"
*!* m.fl=.T.
*!* EXIT
*!* ENDIF
*!* ENDFOR
*!* IF !m.fl
*!* MKDIR ForcePath("logs", JustPath(DBF()))
*!* ENDIF

Set Textmerge On To Forcepath("DataBase.log", Justpath(Dbf()) + "\LOGS") Additive Noshow
\<<DATETIME()>> <<JUSTSTEM(DBF())>> <<RECNO()>> <<DBF()>> <<m.action>> <<ret_prg()>>
Set Textmerge To
Endif
...
Рейтинг: 0 / 0
CBuilder+ODBC+БД FoxPro
    #35590632
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Что делать?" - извечный русский вопрос :-)

Вы собираетесь менять данные в таблицах? А как будете обеспечивать целостность?
Вы изучили все связи, триггеры, правила? Будете работать неэксклюзивно (т.е. одновременно
с самой программой на Фоксе)?

Или вы надеетесь на то, что Фокс - это SQLServer ? :-) Или у вас прога на Фоксе работает как сервер?

Ответ на вопрос: переписать триггеры и правила так, чтобы не было обращений к объектам,
определенным в программном коде (вне совокупности included tables + stores procedures + global variables),
причем на ХП, вызываемые из триггеров/правил, накладываются те же ограничения. Это как минимум.
...
Рейтинг: 0 / 0
CBuilder+ODBC+БД FoxPro
    #35590659
leksu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM спасибо за разъяснения.
менять конечно же ничего нельзя самому, да и программеры видимо не станут переписывать. хотя они меня уверяли что триггеры автономные и им ничего не надо.
Тема закрыта
...
Рейтинг: 0 / 0
CBuilder+ODBC+БД FoxPro
    #35591901
leksu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вышел из положения кривоватенько.
Написал на FoxPro программу выполняющую SQL из файла.
Все заработало.

Тема Закрыта!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CBuilder+ODBC+БД FoxPro
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]