|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Создал класс CursorAdapter и на его основе создаю несколько курсоров в Data Environment формы из таблиц на MySQL, используя драйвер ОDВС. Все работает красиво – добавляется редактируется кроме полей (date). Через append blank и repl или через insert-вставляет, но потом поля(date) не редактируются даже после пересоздания курсоров. Для отладки в свойстве AfterInsert использую такой код: =messagebox(STR(CURSORGETPROP("Buffering"))+' buff',16,'в AfterInsert!') =messagebox(tableupdate(1,.t.,'kart_reg'),16,'в AfterInsert!') IF TableUpdate(.T.,.T.,"kart_reg")=.F. LOCAL laError(1) =AERROR(laError) * Анализ массива laError для уточнения причины ошибки ENDIF В массиве laError нахожу Error(2077) Объекта CursorAdapter в данный момент времени уже используется в другом процессе или, иными словами, не может быть вызван в этот момент времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2012, 16:07 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
ODBC отстой переходи на soap ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2012, 12:34 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Если все поля редактируются и проблема только в одном поле, то, скорее всего, Вы просто не включили это поле в список полей для обновления. Проверьте факт включения этого поля в список полей в свойствах UpdatableFieldList - изменения в каких полях будут передаваться на сервер UpdateNameList - пары соответствия поля CursorAdapter и поля таблицы MySQL Кроме того, не знаю, существует ли в MySQL тип поля date (без фрагмента со временем). Если "нет" и Вы используете свойство CursorSchema для конвертации DateTime на стороне MySQL в Date на стороне FoxPro, то надо не забыть включить использование настроенной схемы через свойство UseCursorSchema = .T. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2012, 16:36 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Благодарю за помощь! Проверил еще все раз. Пока все по прежнему. Может как то сказываетя использование одного базовый СА при создании нескольких разных курсоров? А это основной: this.NEWOBJECT('kart_reg', 'sqlCursor', 'mylib') this.kart_reg.alias = 'kart_reg' this.kart_reg.tables = 'kart_reg' this.kart_reg.KeyFieldList = 'n_kart' this.kart_reg.FetchSize = -1 this.kart_reg.FetchAsNeeded = .F. this.kart_reg.UseCursorSchema = .T. !!! В базовом курсоре - .F. this.kart_reg.CursorSchema = 'N_KART N(4), KSP C(6), DAT_PODACH D(8), NAME_KART C(220), FIO_DIR C(60),DOLJ_DIR C(12), TELEF C(50),FIO_ISPOL C(20), DAT_DORAB D(8), '+; 'OSNOV_DORA C(1), DAT_DOG D(8), NOM_DOGWR C(6), DAT_VOZOBN D(8),IND N(6),GOROD C(5),AB C(2),STREET C(5),DOM C(5),KORPUS C(5),KVART C(5),PR_KART C(1),PRI C(220), '+; 'ADRES C(100), d1 L, d2 L, d3 L, d4 L, d5 L, d6 L, d7 L, d8 L, d9 L, d10 L, d11 L,kod_pol C(2),end1 L, end2 L, end3 L' this.kart_reg.SelectCmd = 'select * from kart_reg'__ this.kart_reg.UpdatableFieldList = 'N_KART, KSP, DAT_PODACH, NAME_KART, FIO_DIR,DOLJ_DIR, TELEF,FIO_ISPOL, DAT_DORAB, OSNOV_DORA, DAT_DOG, NOM_DOGWR, DAT_VOZOBN,'+; 'IND,GOROD,AB,STREET,DOM,KORPUS,KVART,PR_KART,PRI, ADRES, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11,kod_pol,end1, end2, end3' this.kart_reg.UpdateNameList = 'N_KART KART_REG.N_KART, KSP KART_REG.KSP, DAT_PODACH KART_REG.DAT_PODACH,NAME_KART KART_REG.NAME_KART,'+; 'FIO_DIR KART_REG.FIO_DIR,DOLJ_DIR KART_REG.DOLJ_DIR, TELEF KART_REG.TELEF,FIO_ISPOL KART_REG.FIO_ISPOL, DAT_DORAB KART_REG.DAT_DORAB, OSNOV_DORA KART_REG.OSNOV_DORA,'+; 'DAT_DOG kart_reg.dat_dog, NOM_DOGWR kart_reg.nom_dogwr,DAT_VOZOBN kart_reg.dat_vozobn,IND kart_reg.ind,GOROD kart_reg.gorod,AB kart_reg.ab,'+; 'STREET kart_reg.street,DOM kart_reg.dom,KORPUS kart_reg.korpus,KVART kart_reg.kvart,PR_KART kart_reg.pr_kart,PRI kart_reg.pri,ADRES kart_reg.adres,D1 kart_reg.d1,'+; 'D2 kart_reg.d2,D3 kart_reg.d3,D4 kart_reg.d4,D5 kart_reg.d5,D6 kart_reg.d6,D7 kart_reg.d7,D8 kart_reg.d8,D9 kart_reg.d9,D10 kart_reg.d10,D11 kart_reg.d11,'+; 'KOD_POL kart_reg.kod_pol, END1 kart_reg.end1, END2 kart_reg.end2, END3 kart_reg.end3' this.kart_reg.cursorfill() ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2012, 13:20 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
VIVA_CA, у вас неправильно описана CursorSchema: в полях типа Date длина поля не указывается. Попробуйте так: Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2012, 14:24 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Благодарю – исправил На форме с выше с вышеописанном СА при добавлении записи: LOCAL n zap_add=1 &&признак добавления записи thisform.pageframe1.page1.SetAll("ReadOnly", .f.) thisform.pageframe1.page1.SetAll("Enabled",.t., "Tscombobox") sele kart_reg n=0 * Найти максимальный код типа счетчика calc max(n_kart) to n n=n+1 *DODEFAULT() insert into kart_reg (n_kart,dat_podach) values (n,date()) *APPEND blank * REPLACE kart_reg.n_kart WITH n, kart_reg.dat_podach WITH date(), nzap=recno() goto nzap thisform.pageframe1.page1.tst_nom.setfocus thisform.pageframe1.page1.refresh выдает: Connectivity error ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2012, 15:48 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
dmitryxVIVA_CA, у вас неправильно описана CursorSchema: в полях типа Date длина поля не указывается. Это без разницы. Для полей длина которых фиксирована и не может быть изменена, указанное пользователем значение просто игнорируется. Код: sql 1. 2. 3. 4.
Тем более, что поле типа Date в FoxPro действительно занимает 8 байт ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2012, 17:03 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
1. Не лезьте пока в методы AfterInsert. Он не для этого. Удалите в нем весь свой код. 2. Попробуйте вместо Код: sql 1.
явным образом перечислить все поля. Возможно, порядок следования полей в таблице на MySQL отличается от того порядка, который Вы предполагаете. Перечисление должно идти в том порядке, как поля указаны в CursorSchema Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2012, 17:12 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
!!! Благодарю! Проверю после выходных. Проэкт остался на работе Я из Гомеля - ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2012, 17:36 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
VIVA_CAСоздал класс CursorAdapter и на его основе создаю несколько курсоров в Data Environment Характер приведенных сообщений об ошибках наводит на мысль о конфликте нескольких экземпляров класса СА при использовании общего ODBC соединения. Лучше создавать курсорадаптеры не в DE, а программно - в LOAD формы. Прослойка в виде Data Environment только порождает проблемы, без нее курсорадаптеры становятся более "управляемыми". По поводу передачи полей типа DATE из FoxPro в MySQL и обратно - ошибка возникает только при попытке передать "пустую" дату из Foxpro - ее нужно заменять на NULL. В остальных случаях проблем не возникает. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2012, 19:52 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
! Благодарю всех за направления к действию!!! Пробую по возможности все варианты. В MySQL - есть тип поля date – по умолчанию заношу “0000-00-00”, пробовал ничего не заносить. Почистил свойство AfterInsert – убрал все и TableUpdate В select перечислил поля как в схеме. Сообщение при добавлении записи “Connectivity error “ не выскакивает. Явной ошибки при попытке передать "пустую" дату из Foxpro на MySQL не наблюдаю. Все пока вернулось на исходную позицию – т.е. поля Date на MySQL не обновляютя как пустые так и первоначвльно добавленные Insert-ом. Может есть у кого пример программного создания СА - в LOAD формы с датой и как формат описан на MySQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2012, 12:04 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Вот простенький фрагмент из LOAD формы. Все вводится и кооректируется. Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2012, 15:44 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Спасибо! Перепишу все по новой согласно Вашему примеру и еще ? Что происходит если ключевое поле KeyFieldList = "IDZ" будет присутствовать в UpdatableFieldList и в UpdateNameList и какой формат полей IDZ, DATAPR, DATAUV у Вас на MySQL ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2012, 16:27 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
IDZ - это первичный ключ записи, тип INTEGER c автоинкрементом, поэтому его нельзя изменять при UPDATE и передавать при INSERT. DATAPR, DATAUV - типа DATE Под "пустой" датой я имел ввиду фоксовскую дату из пробелов - {" . . "} - в этом случае возникает ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2012, 17:07 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Хорошая штука СА - очень хочется разобраться до конца! Ввел дополнительное поле IDZ на MySQL (по образцу). IDZ - это первичный ключ записи, тип INTEGER c автоинкрементом. До IDZ не дотрагиваюсь т. е. сам не корректирую . Если this.kart_reg.KeyFieldList = 'IDZ' -запись добавляетя а потом ничего не корректируется. Учел почти все советы, проверил названия и последовательность полей. Если this.kart_reg.KeyFieldList = 'n_kart' остается как было т.е. запись добавляетя и корректируется кроме дат. Поле n_kart на MySQL обычное поле INTYEGER не первичный ключ и не c автоинкрементом(исходный вариант). Может что – то в связке KeyFieldList – CursorSchema – UpdatableFieldList – UpdateNameList и формата и назначения поля на MySQL(или головой)? this.NEWOBJECT('kart_reg', 'sqlCursor', 'mylib') this.kart_reg.DataSource = gn_Soed * this.kart_reg.flags=0 !!!!!! в созданном построителем КЛССЕ "sqlCursor" стоит 0 и ругается если пытаюсь так изменить this.kart_reg.alias = 'kart_reg' this.kart_reg.tables = 'kart_reg' *** this.kart_reg.KeyFieldList = 'n_kart' this.kart_reg.KeyFieldList = 'idz' this.kart_reg.whereType = 3 this.kart_reg.FetchSize = -1 this.kart_reg.FetchAsNeeded = .F. this.kart_reg.UseCursorSchema = .T. this.kart_reg.SelectCmd = 'select ' +; 'N_KART, KSP, DAT_PODACH, NAME_KART, FIO_DIR, DOLJ_DIR, TELEF, FIO_ISPOL, DAT_DORAB, ' + ; 'OSNOV_DORA, DAT_DOG, NOM_DOGWR, DAT_VOZOBN,IND, GOROD, AB, STREET, DOM, KORPUS, KVART, PR_KART, PRI, ' + ; 'ADRES, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, kod_pol, end1, end2, end3, idz ' + ; 'from kart_reg' this.kart_reg.CursorSchema = 'N_KART N(4), KSP C(6), DAT_PODACH D, NAME_KART C(220), FIO_DIR C(60), DOLJ_DIR C(12), '+; 'TELEF C(50), FIO_ISPOL C(20), DAT_DORAB D, OSNOV_DORA C(1), DAT_DOG D, NOM_DOGWR C(6), DAT_VOZOBN D, IND N(6), '+; 'GOROD C(5), AB C(2), STREET C(5), DOM C(5), KORPUS C(5), KVART C(5), PR_KART C(1), PRI C(220), '+; 'ADRES C(100), d1 L, d2 L, d3 L, d4 L, d5 L, d6 L, d7 L, d8 L, d9 L, d10 L, d11 L, kod_pol C(2),end1 L, end2 L, end3 L, idz i(10)' this.kart_reg.UpdatableFieldList = 'N_KART, KSP, DAT_PODACH, NAME_KART, FIO_DIR,DOLJ_DIR, TELEF,FIO_ISPOL, DAT_DORAB, OSNOV_DORA, DAT_DOG, NOM_DOGWR, DAT_VOZOBN,'+; 'IND,GOROD,AB,STREET,DOM,KORPUS,KVART,PR_KART,PRI, ADRES, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11,kod_pol,end1, end2, end3, idz' this.kart_reg.UpdateNameList = 'N_KART KART_REG.N_KART, KSP KART_REG.KSP, DAT_PODACH KART_REG.DAT_PODACH,NAME_KART KART_REG.NAME_KART,'+; 'FIO_DIR KART_REG.FIO_DIR,DOLJ_DIR KART_REG.DOLJ_DIR, TELEF KART_REG.TELEF,FIO_ISPOL KART_REG.FIO_ISPOL, DAT_DORAB KART_REG.DAT_DORAB, OSNOV_DORA KART_REG.OSNOV_DORA,'+; 'DAT_DOG kart_reg.dat_dog, NOM_DOGWR kart_reg.nom_dogwr,DAT_VOZOBN kart_reg.dat_vozobn,IND kart_reg.ind,GOROD kart_reg.gorod,AB kart_reg.ab,'+; 'STREET kart_reg.street,DOM kart_reg.dom,KORPUS kart_reg.korpus,KVART kart_reg.kvart,PR_KART kart_reg.pr_kart,PRI kart_reg.pri,ADRES kart_reg.adres,D1 kart_reg.d1,'+; 'D2 kart_reg.d2,D3 kart_reg.d3,D4 kart_reg.d4,D5 kart_reg.d5,D6 kart_reg.d6,D7 kart_reg.d7,D8 kart_reg.d8,D9 kart_reg.d9,D10 kart_reg.d10,D11 kart_reg.d11,'+; 'KOD_POL kart_reg.kod_pol, END1 kart_reg.end1, END2 kart_reg.end2, END3 kart_reg.end3, IDZ kart_reg.idz' If !this.kart_reg.cursorfill(.T.,.F.) m1=Aerror(mm1) =MESSAGEBOX(mm1[2],16,"Ошибка при заполнении курсора") RETURN .f. Endif ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2012, 10:40 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Пытался смоделировать такую ошибку - но безуспешно. Пробовал менять формат даты, SET CENTURY, значения WhereType - все корректируется и передается правильно. Попробуйте вручную прописать для СА запрос в UpdateCMD, а в событие AfterUpdate поставьте AERROR(... - чтобы отловить ошибку. Кстати, какая у Вас версия сервера MySQL и драйвера ODBC (надеюсь, не древняя)? У меня сейчас стоит драйвер версии 3.51.27 (хотя и в ветке 5.1 таких проблем нет), а сервер 5.5.8 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2012, 14:31 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
MySQL ODBC 3.51 Driver Server 5.1 Если не затруднит - что прописать в UpdateCMD для СА? И какой вариант мне все же добивать с this.kart_reg.KeyFieldList = 'n_kart' или this.kart_reg.KeyFieldList = 'idz' как у Вас -вернее какой по теории более правильный Пытался не использовать KeyFieldList - ругается - и по моему правильно делает Благодарю!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2012, 16:54 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
VIVA_CA, В UpdateCmd записывается обычный SQL - запрос UPDATE, передающий изменения из курсора на сервер. Обычно CA сам автоматически строит такие запросы, но в сложных случаях - например, при необходимости поменять тип полей - можно прописать запрос в UpdateCmd. Что-то типа: Код: vbnet 1. 2.
Но сначала попробуйте проверить, что выдаст AERROR в AfterUpdate -без AERROR никаких сообщений об ошибке может не выдаваться, даже если запрос Update на сервере вылетел с ошибкой. В KeyFieldList заносится список ключевых полей, по которым запросы UPDATE выполняют поиск изменяемых записей. Лучший вариант - когда там записано единственное поле - первичный ключ. Содержимое KeyFieldList используется для построения секции WHERE запросов UPDATE. Если таблица не имеет первичного ключа (что не есть хорошо), можно использовать другие поля, по которым в таблице построены индексы. Использование не индексированных полей приведет к построению не оптимизируемых запросов и к тормозам. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2012, 23:49 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Благодарю – за терпение !!! Текучка не дает сосредоточиться. 1)Вот что у меня показывает DEGUG в параметрах передаваемых в AfterUpdate Cfldstate - ‘111111111112111111…..’ Lforce - .F. Nupdatetype – 1 А эта команда сформировалась при корректировке поля dat_dog и не анализирует .NULL. Cupdateinsertcmd -Update kart_reg set dat_dog= ?kart_reg.dat_dog where n_kart =?oldval(‘nkart’,’kart_reg’) and dat_dog=?oldval(‘dat_dog’,’kart_reg’) lresult - .T. и =AERROR(laerror) выдал laerror[1] = .F. laerror[2] = .F. laerror[3] = .F. 2)А если на MySQL в поле dat_dog отмечаю ALLOW NULL и при добавлении записи: APPEND blank REPLACE … kart_reg.dat_dog WITH .null. - то в дальнейшем дата корректируетя (но в пустых в полях – настараживает пользователя NULL) А как у вас дата прописана на MySQL 3) Пытаюсь по Вашему образцу в LOAD формы создать СА(Соединение создается раньше) SET CENTURY ON SET date GERMAN This.ca1=CREATEOBJECT("CursorAdapter") !!! Выдает Property CA1 is not found Где у Вас прописано это свойство? IF TYPE("this.ca1")= "0" WITH This.ca1 .DataSource = gn_Soed !!! Соединение создается раньше .alias = 'kart_reg' .tables = 'kart_reg' .KeyFieldList = 'n_kart' .whereType = 3 .FetchSize = -1 .FetchAsNeeded = .F. .UseCursorSchema = .T. … ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2012, 12:44 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Ситуация прояснилась. Даты (пустые) не корректировались, во первых, из-за того, что FoxPro и MySQL по разному понимают "пустую" дату, а во вторых, у Вас стоит WhereType = 3 (старое значение даты участвует в выражении Where и сервер из-за этого не находит корректируемую запись). Ошибки при этом не возникает, но и запись не изменяется. Значение .NULL. в этом случае обрабатывается нормально. Хотя, чтобы не смущать приходится пользователей, приходится в SelectCmd вставлять преобразование: iif(isnull(datex),ctod(' . . '),datex), а в UpdateCmd и InsertCmd - обратное преобразование. 3) This.Ca1 - свойство формы нужно создать вручную. Я использую "комбинированную" технологию создания курсор-адаптеров. Сначала создаю их штатным билдером в DE, делаю привязку к элементам формы - избавляю себя от рутинной работы. Затем запускаю небольшую утилиту, которая формирует программное (текстовое) описание всех CA формы и записывает его в буфер обмена. Остается вставить его в LOAD формы и удалить курсоры из DE. Затем "допиливаю" CA, чтобы учитывались все нюансы. Прилагаю эту утилиту, может окажется полезной. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2012, 14:45 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Огромное спасибо - дякую!!! Обязательно разберусь с Вашим примером. Я многое почерпнул за это время общения. Поджимает время с проектом. А что посоветуете пока в моем случае с WhereType = 3? SelectCmd –подкорректирую согласно Вашей подсказке. UpdateCmd не хотелось бы отслеживать в ручном режиме – он сам как, я понял отслеживает корректируемые поля(но этот NULL?!!!) И хочется повториться - как у вас поле дата прописано на MySQL т. е. что в DEFAULT и ALLOW NULL. С уважением и благодарностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2012, 17:31 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Для полей типа DATE значение по дефолту лучше использовать NULL (и ALLOW NULL, естественно) - это значение Фокс и MySQL понимают одинаково. Тогда все будет работать и при WhereType = 3. Если заменять NULL на более привычное пользователю значение, то преобразовывать придется как при чтении, так и при записи (обновлении) - СА этого не делает. По поводу значения WhereType. Наиболее быстрый вариант - WhereType = 1, когда поиск записей выполняется по первичному ключу. Но этот вариант не применим в ситуации, когда корректируемое поле может быть изменено другим пользователем (например, если корректируемое поле - остаток товара на складе при оформлении заказов). В этом случае при WhereType = 3 Update не произойдет и пользователь будет поставлен в известность об изменившейся ситуации. Хотя, в сложных случаях проще будет использовать сквозные запросы. СA - это не панецея, а способ сокращения рутинной работы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2012, 22:48 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Наконец все стало на свои места! – Основная проблема решена. Боюсь утомить, но хотелось бы узнать Ваше мнение – по каким причинам не рекомендуют использовать среду DE? (на сайтах просто не рекомендуют использовать) и еще - как обмануть DE не закрывать CA при закрытии формы – AutoCloseTables c CA не срабатывает (хотя уже перевожу все в LOAD формы) и почему , если использовать KeyFieldList = 'n_kart' и это поле на MySQL - не первичный ключ и если есть несколько записей с одинаковыми значениями в n_kart и dat_dog то при корректировке одного значения поля dat_dog -значение на MySQL меняется на всех этих записях. Иногда при добавлении записи добавляетя 2 или даже больше(подозреваю что при не удачной попытке обновления не очищается буфер – как с этим бороться?) Спасибо!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 10:19 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
по каким причинам не рекомендуют использовать среду DE? Если нужно сделать быстро - используйте DE, если профессионально - описывайте все программно. Например, в серьезном проекте нельзя написать просто USE TABLE_X ... , а нужно хотя бы заключить эту команду в TRY ... CATCH ... ENDTRY и обработать возможные сбойные ситуации. Может возникнуть необходимость работать с несколькими базами данных и переключаться между ними в процессе работы. Открытие и закрытие таблиц без DE более гибко, дает возможность выполнить все необходимые проверки, а DE обеспечивает только базовый функционал. как обмануть DE не закрывать CA при закрытии формы В этом случае (ясли я правильно Вас понял) нужно и открывать его не в этой форме, а в главной форме (программе) проекта. Иначе при DESTROY формы будет уничтожена переменная (свойство формы) - ссылка на объект СА и он тоже будет уничтожен. СА, созданные программно, нужно закрывать при закрытии формы - как обычные курсоры. Предварительно стоить выполнить TABLEUPDATE c проверкой ее кода завершения и с обработкой исключений - иначе USE может вылететь с ошибкой. и почему , если использовать KeyFieldList = 'n_kart' и это поле на MySQL - не первичный ключ и если есть несколько записей с одинаковыми значениями в n_kart и dat_dog то при корректировке одного значения поля dat_dog -значение на MySQL меняется на всех этих записях. Это нормальный результат работы запроса UPDATE - изменять все записи в таблице, соответствующие условиям, описанным в секции WHERE. Если нужно изменить какую-то отдельную запись с не уникальным значением 'n_kart' - в поле KeyFieldList нужно записать такую комбинацию полей, которая позволит однозначно определить нужную запись. А лучше использовать уникальный первичный ключ, например, поле с автоинкрементом. Возьмите себе за правило всегда создавать в таблице первичный ключ - и Вы избавитесь от многих проблем. Иногда при добавлении записи добавляетя 2 или даже больше Чтобы такого не происходило нужно проверять завершение команды INSERT - в событии AFTERINSERT и обрабатывать возникающие ошибки. При работе с SQL - сервером могут происходить многие непредвиденные ситуации - сбой в сети, обрыв соединения, перегрузка сервера и т.п. Поэтому главный принцип - проверяй завершение каждого шага. Желаю успехов ! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 14:59 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Sea_Cat, Спасибо, что уделили мне столько времени! Вы мне очень помогли!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 15:35 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
VIVA_CA, Уважаемый Учитель, грустно стало без общения! Хочу отказаться от создания СА в DE и по Вашей методике перейти в LOAD. Если можно – подробнее по пунктам( как в последнем ответе) : Я создаю Class CA штатным билдером и на его основе затем в DE используя This.ca1=This.NEWOBJECT('ca1', 'sqlCursor', 'mylib') привязываю к конкретной форме. ( Сейчас уже все ок! даже с датами) Но если весь текст настройки переношу в LOAD (простым копированием) - при инициализации формы Выдает:( из Help) Объектный класс недопустим для этого контейнера (Ошибка 1744) Вы попытались добавить объект, как член родительского объекта, методом AddObject . Он не может быть добавлен, потому что класс объекта как члена, не может быть членом объекта родительского класса. Например, Вы не можете добавить объект Grid к объекту PageFrame. Это понятно! Но как выкрутиться? При This.ca1=CREATEOBJECT("CursorAdapter")- не ругаетя – но естественно это уже другой СА. Я так понимаю – вы изначально создаете СА в DE чтобы отладиться? Как Вы писали раньше – создал свойство CA1(все описание его по умолчанию) на форме и в LOAD ( или это сделает утилита tr_cad ?) Как сделать привязку к элементам формы( Что под этим понимается - указание конкретных полей?) Как запускается (откуда) ? tr_cad И какие еще учесть нюансы CA после отработки tr_cad, копирования из буфера в LOAD, и удаления из DE? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2012, 12:38 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
VIVA_CAБоюсь утомить, но хотелось бы узнать Ваше мнение – по каким причинам не рекомендуют использовать среду DE? (на сайтах просто не рекомендуют использовать) Основная причина - банальное непонимание! Непонимание даже не столько собственно DE, сколько общих принципов построения приложения. Разумеется, есть ситуации, с которыми DE справиться не может или может очень "экзотическими" способами. Но в подавляющем большинстве проектов подобных ситуаций просто не возникает. Собственно, главная претензия к DE - это невозможность (или большая сложность) программного управления настройками DE на этапе выполнения приложения. Вопрос о том, а зачем собственно нужно эта самое программное управление и нельзя ли обойтись без него даже не поднимается. Вот хочется и все! С другой стороны, то, что делает DE - очень просто выполнить программно. Это буквально несколько строк кода. Вот и появляется рекомендация не использовать DE совсем. А это неправильно. DE - это очень удобный инструмент для "визуальной" настройки объектов формы. Ну, например, чтобы указать таблицу-источник объекта, можно выбрать из раскрывающегося списка. Но только в том случае, если эта таблица включена в DE. VIVA_CAи еще - как обмануть DE не закрывать CA при закрытии формы – AutoCloseTables c CA не срабатывает (хотя уже перевожу все в LOAD формы) Вот это как раз и является типичной ситуацией непонимания общих принципов построения приложения. Если Вам нужен объект вне формы, то и создавать его надо вне формы (до вызова формы), а не бороться с последствиями! Только вот, Вы предварительно пробовали понять, а ЗАЧЕМ Вам нужен CA после закрытия формы? Действительно ли нужен именно CA, а не что-то другое? VIVA_CAХочу отказаться от создания СА в DE и по Вашей методике перейти в LOAD. Зачем? Какая у Вас возникла проблема, которую невозможно решить в рамках использования DE? Хочу оставить CA после закрытия формы - это не проблема. Это выбранный Вами способ решения проблемы. А сама проблема-то в чем? Зачем Вам понадобился CA, созданный для работы в конкретной формы вне этой формы? На всякий случай напомню, что событие Object.Load выполняется непосредственно ПЕРЕД созданием экземпляра объекта Object. Т.е. в момент выполнения Form.Load собственно объекта Form еще не существует! Как следствие, невозможно как-то повлиять (создать, изменить) на свойства не существующего объекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2012, 15:29 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Уважаеиый ВладимирМ, Большое спасибо за Ваши несколько резкие но справедливые ответы на мои предыдущие вопросы. Многие нюансы paботы с CA я переосмыслил в переписке с уважаеиым Sea_Cat и с Вами. Пока меня устраивает работа СА в DE. Но в большинстве ответов уважаемых метров на вопросы чайников проскальзывает совет переводить СА из DE в LOAD. В самом последнем моем запросе (!!! на 2-й стр.) я просил уважаемого Sea_Cat поделиться опытом. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2012, 18:10 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
ВладимирМОсновная причина - банальное непонимание! Непонимание даже не столько собственно DE, сколько общих принципов построения приложения. Чтобы с пониманием подходить к работе с DE и CA, хочу порекомендовать циклы статей Юрия Шутенко по DE http://www.hot.ee/jurisfox/vfp60/de_01_ru.htm и по работе с СА http://kodu.neti.ee/~juri4/vfp60/ca_01_ru.htm . Также поиск по теме CursorAdapter на форуме FoxClub.ru даст много полезной информации. ВладимирМDE - это очень удобный инструмент для "визуальной" настройки объектов формы. От такого инструмента отказываться на этапе проектирования просто неразумно. Например, перетащив заголовок курсора из DE на форму, получаем заготовку грида, у которого все колонки уже привязаны к источнику данных, остается оформить заголовки, да отрегулировать ширину колонок. Также легко - перетаскиванием - создаются поля ввода TEXT. Когда визуальное проектирование формы закончено, закрываю редактор форм, запускаю tr_cad и указываю файл формы (.SCX). Затем снова запускаю форму, открываю LOAD и вставляю из буфера обмена программное описание всех СA. Остается удалить их из DE. В достаточно простых случаях - если в форме один - два СА - пусть они остаются в DE. Но если, к примеру, нужно при создании СА поменять SelectCmd - тут приходится работать с программной реализацией CA. То, что в событие LOAD невозможна передача параметров - не проблема. Нужную информацию для построения СА можно передать через класс-посредник (на худой конец - через глобальные переменные). Это только один из вариантов работы с СА. На этом форуме много своих примеров по работе с CA выкладывал прошелмимо , у него другой подход, тоже можно почерпнуть много полезного. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2012, 23:40 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
Sea_Cat, Читаю с большим интересом статьи которые вы рекомендовали. Но хочется до конца разобраться с затронутой Вами темой. 1) Например, перетащив заголовок курсора из DE на форму – как это делается и что означает? Также легко - перетаскиванием - создаются поля ввода TEXT. - ? если можно подробнее! 2) Работа с tr_cad: Я создаю Class CA штатным билдером и записываю в бибилиотеку классов и на его основе затем в DE BeforeOpenTables: This.NEWOBJECT('ca1', 'sqlCursor', 'mylib') и дальше остальные свойства this.ca1.DataSource = gn_Soed и т.д. Закрываю форму Запускаю tr_cad – ругается на первой строчке Parameters n_frm (естественно тк не процедура) Ignore Scan For Alltrim(frm.Class) = 'cursoradapter' не выполняется условие- те не находит Визуально просмотрел и остальные поля таблицы frm - нет Я так понимаю надо использовать CREATEOBJECT("CursorAdapter")? Но теряется смысл ипользования созданного класса? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2012, 11:24 |
|
CursorAdapter не обновляет поля(date) на MySQL- Прошу помочь
|
|||
---|---|---|---|
#18+
VIVA_CA, что-то Вы совсем запутались. Зачем создавать объект в BeforeOpenTables ? И в чем смысл создания своего класса CA ? Так обычно поступают с визуальными объектами форм, создавая свои классы на основе стандартных, задавая общую цветовую схему, стиль оформления и т.п. А что общего можно прописать для свойств и методов СА ? Я рекомендую идти от простого к сложному. Почитайте статьи Юрия Шутенко - это как букварь по СА. Создайте тестовый проект и на простых примерах разберитесь, что и как работает. Начните с создания СА билдером в DE - без NEWOBJECT и промежуточных классов. Когда столкнетесь с ситуацией, когда невозможно что-либо реализовать в рамках DE - вот тогда и переходите к программному созданию СА. По поводу перетаскивания объектов из DE на форму - все очень просто. Откройте DE, найдите нужный Вам курсор, установите указатель мышки на заголовок курсора, нажмите левую кнопку и тяните на форму. Когда отпустите кнопку - будет Вам Grid. Точно также и с отдельными полями курсора. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2012, 13:33 |
|
|
start [/forum/topic.php?all=1&fid=41&tid=1583570]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 271ms |
total: | 418ms |
0 / 0 |