Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Modify Datastore / 25 сообщений из 36, страница 1 из 2
15.08.2006, 18:16
    #33919773
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
подскажите можно-ли использовать Мodify с datastore
почему-то не работает.


l_origin_clause = ""
l_ac_clause = ""

StartDate = uo_1.of_start_end_date(TRUE)
EndDate = uo_1.of_start_end_date(FALSE)

l_origin_oid = dw_city.getItemNumber(1, 'city_oid')

l_ac_oid = dw_ac.getItemNumber(1, 'aircraft_oid')
if not isnull(l_origin_oid) then
l_origin_clause = ' and flight_data.origination_oid = '+ string(l_origin_oid)
end if

if not isnull(l_ac_oid) then
l_ac_clause = ' and flight_data.aircraft_oid = ' + string(l_ac_oid)
end if

if ((uo_1.em_start.text <> "00/00/00") or (uo_1.em_end.text <> "00/00/00" )) then
l_date_clause = l_date_clause + " and flight_data.actual_time_out >= '" + String(uo_1.of_start_end_Date(True)) + "' "
l_date_clause = l_date_clause + " and flight_data.actual_time_out < DateAdd(d, 1, '" + String(uo_1.of_start_end_Date(False)) + "') "
end if


ModifiedWhere = "DataWindow.Table.Select='" + OriginalWhereClause + l_origin_clause + l_ac_clause + l_date_clause + "'"

ds.Modify(modifiedWhere)
ds.Retrieve()

//if isnull(l_inv_oid) or l_inv_oid = 0 then return

total_rows = DS.RowCount() // Etot statement daet 0)
...
Рейтинг: 0 / 0
15.08.2006, 18:19
    #33919777
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
SvetaSh wrote:

> подскажите можно-ли использовать Мodify с datastore

Да.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
15.08.2006, 18:28
    #33919804
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
Тогда, в чем проблема, может я что-то пропускаю.

После Мodify, Retrive не дает ни каких результатов. (total_rows всегда 0)
...
Рейтинг: 0 / 0
15.08.2006, 18:33
    #33919810
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
а что возращает Modify
чему равно OriginalWhereClause

вот ради примера

ls_SQL = ldwc.Describe ("DataWindow.Table.Select")
ls_SQL += ' and q.id in ( '+ string(idc_1)+' , '+string(idc_2)+') '
ls_SQL = inv_string.of_globalreplace( ls_SQL, "'", "~~~'")
ls_Err = ldwc.Modify ("DataWindow.table.Select='" + ls_SQL + "'")
...
Рейтинг: 0 / 0
15.08.2006, 18:37
    #33919821
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
OriginalWhereClause возвращает query from Datawindow, эта часть работает, а вместе с Modify нет.

я пыталась run select statement отдельно, все работает, а в скрипте нет. ???
...
Рейтинг: 0 / 0
15.08.2006, 18:42
    #33919837
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
OriginalWhereClause возвращает query from Datawindow, эта часть работает, а вместе с Modify нет.

я пыталась run select statement отдельно, все работает, а в скрипте нет. ???
...
Рейтинг: 0 / 0
15.08.2006, 18:59
    #33919873
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
попробуйте устанавливать SQL с помощью ф-ции SetSQLSelect() вместо modify.

//
а не работает т.к. не экранированы кавычки:

l_date_clause = .... + " ' "
...
ModifiedWhere = "DataWindow.Table.Select= ' " + OriginalWhereClause + l_origin_clause + l_ac_clause + l_date_clause + " ' "


т.е. в ModifiedWhere у вас что-то вроде
Код: plaintext
1.
DataWindow.Table.Select='select ....and flight_data.actual_time_out < DateAdd(d, 1, '01/ 11 / 1970 ')  '

где начинаются строки, где заканчиваются - PB разобрать не может...
...
Рейтинг: 0 / 0
15.08.2006, 19:17
    #33919908
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
pomeniala...
if ((uo_1.em_start.text <> "00/00/00") or (uo_1.em_end.text <> "00/00/00" )) then
l_date_clause = l_date_clause + " and flight_data.actual_time_out >= ~~~'" + String(uo_1.of_start_end_Date(True)) + "~~~' "
l_date_clause = l_date_clause + " and flight_data.actual_time_out < DateAdd(d, 1, ~~~'" + String(uo_1.of_start_end_Date(False)) + "~~~') "
end if


ModifiedWhere = "'" + OriginalWhereClause + l_origin_clause + l_ac_clause + l_date_clause + "'"

DS.Reset()
DS.SetSQLSelect(modifiedWhere)

DS.Retrieve()

//if isnull(l_inv_oid) or l_inv_oid = 0 then return

l_file_dir = "\\ntserver02\LOG_PAGE\"
total_rows = DS.RowCount()

Vse ravno Total_rows is 0.
...
Рейтинг: 0 / 0
15.08.2006, 19:55
    #33919986
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
SvetaShpomeniala...
if ((uo_1.em_start.text <> "00/00/00") or (uo_1.em_end.text <> "00/00/00" )) then
l_date_clause = l_date_clause + " and flight_data.actual_time_out >= ~~~'" + String(uo_1.of_start_end_Date(True)) + "~~~' "
l_date_clause = l_date_clause + " and flight_data.actual_time_out < DateAdd(d, 1, ~~~'" + String(uo_1.of_start_end_Date(False)) + "~~~') "
end if


ModifiedWhere = "'" + OriginalWhereClause + l_origin_clause + l_ac_clause + l_date_clause + "'"

DS.Reset()
DS.SetSQLSelect(modifiedWhere)

DS.Retrieve()

//if isnull(l_inv_oid) or l_inv_oid = 0 then return

l_file_dir = "\\ntserver02\LOG_PAGE\"
total_rows = DS.RowCount()

Vse ravno Total_rows is 0.
Скорее всего, Dmitry. прав, но Вам, SvetaSh, прежде чем задавать вопрос в форум, следовало бы проверить, какой именно запрос оправляется на сервер, возвращает ли сервер ошибку и какую именно. Вы в своем коде ничего этого не делаете, что плохо уже само по себе. Ну и, кроме того, вырванный из контекста кусок наводит меня на мысль о том, что о стиле программирования Вы тоже не задумываетесь. Подумайте, хотя бы, о тех людях, которым, вероятно, придется сопровождать Ваше творение.

Теперь советы:
1. Проверьте код возврата функции SetSQLSelect() PowerBuilder Help Return value

SetSQLSelect returns 1 if it succeeds and -1 if the SELECT statement cannot be changed. I
2. Количество строк в DW/DS не может служить критерием ошибки. Проверьте код возврата функции Retrieve() PowerBuilder Help Return value

Returns the number of rows displayed (that is, rows in the primary buffer) if it succeeds and -1 if it fails.
3. Проверьте код ошибки, которую возвращает сервер, в случае, если функция Retrieve вернула -1. Как это сделать, Вам уже объясняли

PS: Как правильно задавать вопросы
...
Рейтинг: 0 / 0
16.08.2006, 10:48
    #33920757
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
PL991)...
2)...
3)...Полностью согласен.

А SetTransObject вы используете?
...
Рейтинг: 0 / 0
16.08.2006, 16:33
    #33922495
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
Retrieve() = -1,
proverila code oshibki = ""
??
...
Рейтинг: 0 / 0
16.08.2006, 20:50
    #33923257
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
SvetaShRetrieve() = -1,
proverila code oshibki = ""
??Что есть code oshibki ? SQLErrText?

PowerBuilder Help SQLCode Long The success or failure code of the most recent operation.Return codes:· 0 — Success· 100 — Not found· -1 — Error (use SQLDBCode or SQLErrText to obtain the details)SQLDBCode Long The database vendor's error code.SQLErrText String The database vendor's error message
Скорее всего у Вас неправильно формируется результирующий SQL запрос.
Что именно отсылается на сервер можно посмотреть, перехватывая событие SQLPreview
PowerBuilder Help Description

Occurs immediately before a SQL statement is submitted to the DBMS. Functions that trigger DBMS activity are Retrieve, Update, and ReselectRow.
PowerBuilder event information
Event ID: pbm_dwnsql

Argument Description
request SQLPreviewFunction by value. The function that initiated the database activityFor a list of valid values, see SQLPreviewFunction
sqltype SQLPreviewType by value. The type of SQL statement being sent to the DBMSFor a list of valid values, see SQLPreviewType
sqlsyntax String by value. The full text of the SQL statement
buffer DWBuffer by value. The buffer containing the row involved in the database activity For a list of valid values, see DWBuffer
row Long by value. The number of the row involved in the database activity, that is, the row being updated, selected, inserted, or deletedВас здесь, прежде всего, будет интересовать аргумент sqlsyntax . Сравните его с тем, что Вы ожидаете.
...
Рейтинг: 0 / 0
16.08.2006, 20:54
    #33923265
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
EstetsА SetTransObject вы используете?Да, кстати!
PowerBuilder Help SetSQLSelect method (DataWindows)
Syntax
PowerBuilder


integer dwcontrol. SetSQLSelect ( string statement )
...
Usage

Use SetSQLSelect to dynamically change the SQL SELECT statement for a DataWindow object in a script.
If the DataWindow is updatable, PowerBuilder validates the SELECT statement against the database and DataWindow column specifications when you call the SetSQLSelect method. Each column in the SQL SELECT statement must match the column type in the DataWindow object. The statement is validated only if the DataWindow object is updatable.
You must use the SetTrans or SetTransObject method to set the transaction object before the SetSQLSelect method will execute.
В отличие от modify.
...
Рейтинг: 0 / 0
16.08.2006, 21:42
    #33923305
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
SQLErrText is ""
...
Рейтинг: 0 / 0
16.08.2006, 21:46
    #33923310
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
А SetTransObject вы используете?

Da
...
Рейтинг: 0 / 0
17.08.2006, 10:51
    #33923941
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
SvetaShА SetTransObject вы используете?

Da
Пришлите тогда еще раз кусок кода выполняющий SetSQLSelect и Retrieve.
И что возвращает SetSQLSelect?
...
Рейтинг: 0 / 0
17.08.2006, 16:39
    #33925583
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
я использую SetTransObject в open()

DS = CREATE DATASTORE
Ret = CREATE DATASTORE

DS.DataObject = 'dw_logpage_datastore'

DS.SetTransObject(SQLCA)

OriginalWhereClause = ds.Describe("DataWindow.Table.Select")
//OriginalWhereClause = SELECT distinct
aircraft = (select aircraft_id from aircraft_data where oid = flight_data.aircraft_oid),
flight_data.log_page,
Origin = (Select location_id from location_master where oid = flight_data.origination_oid),
date = (select min(actual_time_off) from flight_data fd where log_page = flight_data.log_page)
FROM flight_data
WHERE
flight_data.status_sym = 'Completed'

//

THEN.....в clicked()



StartDate = uo_1.of_start_end_date(TRUE)
EndDate = uo_1.of_start_end_date(FALSE)

l_origin_oid = dw_city.getItemNumber(1, 'city_oid')

l_ac_oid = dw_ac.getItemNumber(1, 'aircraft_oid')
if not isnull(l_origin_oid) then
l_origin_clause = ' and flight_data.origination_oid = '+ string(l_origin_oid)
end if

if not isnull(l_ac_oid) then
l_ac_clause = ' and flight_data.aircraft_oid = ' + string(l_ac_oid)
end if
//ds.Reset()
//DS.Retrieve(StartDate, EndDate, l_origin_oid, l_ac_oid)

////***************Если Датавиндоу имеет аргументы, все работало, но мне нужно было поменять, сделать без аргументов и с Modify Select statement.
////
i
if ((uo_1.em_start.text <> "00/00/00") or (uo_1.em_end.text <> "00/00/00" )) then
l_date_clause = l_date_clause + " and flight_data.actual_time_out >= ~~~'" + String(uo_1.of_start_end_Date(True)) + "~~~' "
l_date_clause = l_date_clause + " and flight_data.actual_time_out < DateAdd(d, 1, ~~~'" + String(uo_1.of_start_end_Date(False)) + "~~~') "
end if


ModifiedWhere = "'" + OriginalWhereClause + l_origin_clause + l_ac_clause + l_date_clause + "'"

//ModifiedWhere = ' SELECT distinct
aircraft = (select aircraft_id from aircraft_data where oid = flight_data.aircraft_oid),
flight_data.log_page,
Origin = (Select location_id from location_master where oid = flight_data.origination_oid),
date = (select min(actual_time_off) from flight_data fd where log_page = flight_data.log_page)
FROM flight_data
WHERE
flight_data.status_sym = 'Completed'

and flight_data.origination_oid = 1399 and flight_data.aircraft_oid = 111 and flight_data.actual_time_out >= ~'6/1/2006 00:00:00~' and flight_data.actual_time_out < DateAdd(d, 1, ~'8/17/2006 00:00:00~') '//


//DS.Reset()
error_check = DS.SetSQLSelect(modifiedWhere)
//error_check = 1//
error_check = DS.Retrieve()
//error_check = -1//

if DS.Retrieve() = 1 then
lsErr = "Database has been updated."
commit;
else
lsErr = sqlca.SQLErrText

//lsErr = ""//
rollback;
end if;
MessageBox("Save",lsErr)


//if isnull(l_inv_oid) or l_inv_oid = 0 then return

l_file_dir = "\\ntserver02\LOG_PAGE\"
total_rows = DS.RowCount()
For CurRow = 1 To DS.RowCount()
ReturnValue = w_reports.dw_1.InsertRow(0)


l_log_page = ds.object.log_page[CurRow]


l_file_name = l_log_page + ".pdf"

l_file_location = l_file_dir + l_file_name

if not FileExists ( l_File_Location ) then
w_reports.dw_1.object.file_exists[ReturnValue] = "NO"
else
w_reports.dw_1.object.file_exists[ReturnValue] = "YES"
end if
w_reports.dw_1.object.log_page[ReturnValue] = ds.object.log_page[CurRow]
w_reports.dw_1.object.ac_id[ReturnValue] = ds.object.aircraft[CurRow]
w_reports.dw_1.object.date[ReturnValue] = ds.object.Date[CurRow]
w_reports.dw_1.object.origin[ReturnValue] = ds.object.origin[CurRow]

Next

w_reports.dw_1.SetSort("file_exists , date")

w_reports.dw_1.Sort()
close(w_logpage_pdf_rpt)


*****Огромное спасибо всем за помощь*****
...
Рейтинг: 0 / 0
17.08.2006, 18:10
    #33925985
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
SvetaSh
DS = CREATE DATASTORE
Ret = CREATE DATASTORE

Так делать не надо.
Сделайте свой datastore унаследованный от стандартного.
SQL ошибки можно будет ловить в событии dberror вашего datastore

SvetaSh
error_check = DS.Retrieve()
//error_check = -1//

if DS.Retrieve() = 1 then
lsErr = "Database has been updated."
commit;
else
lsErr = sqlca.SQLErrText

SvetaSh, а также специалисты дающие советы - запомните - ни dw.Retrieve(), ни dw.Update() не меняют свойств транзакционного объекта. Все sql ошибки в datawindow/datastore следует ловить в dberror event!!!
...
Рейтинг: 0 / 0
17.08.2006, 18:23
    #33926022
alexis glinski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
нужно по дэфолту сделать DataObject без аргументов, а вместо них изменять WHERE в запросе
...
Рейтинг: 0 / 0
17.08.2006, 22:22
    #33926327
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
pomeniala nazad na Modify()
ds.modify() vozvraschaet error ..


Line 1, Column 439, Incorrect syntax.

Ia ne vizhu nichego wrong s syntax..
...
Рейтинг: 0 / 0
18.08.2006, 10:40
    #33927013
zuzu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
2 SvetaSh
попробуйте перед Retrieve
получить SQL запрос через GetSQLSelect и запустить его через какойто SQL клиент.
правдо у меня подозрения на использование:
String(uo_1.of_start_end_Date(True))
откуда вам известно что формат даты на вашей машине такойже что и на сервере ?
...
Рейтинг: 0 / 0
18.08.2006, 12:33
    #33927667
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
SvetaShpomeniala nazad na Modify()
ds.modify() vozvraschaet error ..


Line 1, Column 439, Incorrect syntax.

Ia ne vizhu nichego wrong s syntax..

Ну так запостите нам строку передаваемую в Modify или посмотрите что находится рядом с 439-ым символом.
...
Рейтинг: 0 / 0
18.08.2006, 17:03
    #33929090
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
Modify...
' SELECT distinct
aircraft = (select aircraft_id from aircraft_data where oid = flight_data.aircraft_oid),
flight_data.log_page,
Origin = (Select location_id from location_master where oid = flight_data.origination_oid),
date = (select min(actual_time_off) from flight_data fd where log_page = flight_data.log_page)
FROM flight_data
WHERE flight_data.status_sym = 'Completed'
AND flight_data.actual_time_off >= '8/1/2006 00:00:00' and flight_data.actual_time_off <= '8/18/2006 00:00:00''
...
Рейтинг: 0 / 0
18.08.2006, 17:14
    #33929136
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
DataWindow.Table.Select=' SELECT distinct
aircraft = (select aircraft_id from aircraft_data where oid = flight_data.aircraft_oid),
flight_data.log_page,
Origin = (Select location_id from location_master where oid = flight_data.origination_oid),
date = (select min(actual_time_off) from flight_data fd where log_page = flight_data.log_page)
FROM flight_data
WHERE flight_data.status_sym = 'Completed'
AND flight_data.actual_time_off >= '8/1/2006 00:00:00' and flight_data.actual_time_off <= '8/18/2006 00:00:00''
...
Рейтинг: 0 / 0
18.08.2006, 17:41
    #33929251
SvetaSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Modify Datastore
Changed ModifyWhere
DataWindow.Table.Select=' SELECT distinct
aircraft = (select aircraft_id from aircraft_data where oid = flight_data.aircraft_oid),
flight_data.log_page,
Origin = (Select location_id from location_master where oid = flight_data.origination_oid),
date = (select min(actual_time_off) from flight_data fd where log_page = flight_data.log_page)
FROM flight_data
WHERE flight_data.status_sym = 'Completed'
AND flight_data.aircraft_oid = 111 AND flight_data.origination_oid = 1399 AND flight_data.actual_time_off >= ~'7/1/2006 00:00:00~' and flight_data.actual_time_off < DateAdd(d, 1, ~'7/31/2006 00:00:00~') '

vse ravno poluchau takuiu zhe error

Line 1, col 435 Incorrect syntax
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Modify Datastore / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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