Проблема с выводом в LIST из очереди

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Проблема с выводом в LIST из очереди

Сообщение optron »

Помогите, если возможно. Думаю, что будет познавательно для тех, кто впервые пытается соединить клашу с MySql,
C5.5EE
Юзаю связку
Clarion – ODBC – MySql
Система вывода в LIST – описанная Андреем Поповым
http://www.clarionlife.net/content/view/54/29/
Если поля Баз – текстовые, то в лист выводятся без проблем.
Пытаюсь вывести в лист «Разноперые» поля – неудача.

Итак, опишу, что делаю.
В Mysql имеются следующие таблицы:
Sprmat
1.JPG
Teams
2.JPG
2.JPG (11.29 КБ) 6704 просмотра
В клаше созданы те же таблицы импортом из MySql, но с !GLO:Owner

Код: Выделить всё

SprMat               FILE,DRIVER('ODBC'),OWNER(glo:owner),NAME('SprMat'),PRE(MAT),BINDABLE,THREAD
PRIMARY                  KEY(MAT:SprMat_ID),PRIMARY
Kod_Key                  KEY(MAT:Kod)
KEY_Kod                  KEY(MAT:Kod),DUP,NAME('Kod')
Name_Key                 KEY(MAT:Name),DUP
NoGr_Key                 KEY(MAT:NoGr,MAT:BS),DUP
Data_Key                 KEY(MAT:Name,MAT:Datavv),DUP
FlagKey                  KEY(MAT:Flag),DUP
Record                   RECORD,PRE()
SprMat_ID                   LONG,NAME('SprMat_ID')
Flag                        BYTE,NAME('Flag')
Kod                         LONG,NAME('Kod')
Name                        STRING(150),NAME('Name')
KodEI                       BYTE,NAME('KodEI')
NoGr                        STRING(6),NAME('NoGr')
BS                          STRING(20)
Deb                         STRING(20),NAME('Deb')
Cena                        REAL,NAME('Cena')
CenaIzm                     REAL,NAME('CenaIzm')
Spec                        BYTE,NAME('Spec')
Poluch                      STRING(20),NAME('Poluch')
Datavv                      DATE,NAME('Datavv')
LoginVV                     STRING(20),NAME('LoginVV')
                         END
                     END                       
Ну и sqlfile

Код: Выделить всё


sqlfile              FILE,DRIVER('ODBC'),OWNER(glo:owner),NAME('Teams'),PRE(sqlfile),BINDABLE,THREAD
Record                   RECORD,PRE()
f1                          CSTRING(256),NAME('TeamID')
f2                          CSTRING(256),NAME('TeamID')
f3                          CSTRING(256),NAME('TeamID')
f4                          CSTRING(256),NAME('TeamID')
f5                          CSTRING(256),NAME('TeamID')
f6                          CSTRING(256),NAME('TeamID')
f7                          CSTRING(256),NAME('TeamID')
f8                          CSTRING(256),NAME('TeamID')
f9                          CSTRING(256),NAME('TeamID')
f10                         CSTRING(256),NAME('TeamID')
                         END
                     END                       
Далее, в Datasection:

Код: Выделить всё

!SprMatQueue   queue  ! Так пробую – не проходит
!Flag          CSTRING(256)
!Kod           CSTRING(256)
!Name          CSTRING(256)
!NoGr          CSTRING(256)
!BS            CSTRING(256)
!Poluch        CSTRING(256)
!Cena          CSTRING(256)
!SprMat_ID     CSTRING(256)
!              end
SprMatQueue   queue  ! Пробую так – тоже не проходит
Flag          like(MAT:Flag)
Kod           like(MAT:Kod)
Name          like(MAT:Name)
NoGr          like(MAT:NoGr)
BS            like(MAT:BS)
Poluch        like(MAT:Poluch)
Cena          like(MAT:Cena)
SprMat_ID     like(MAT:SprMat_ID)
              end
Ha окне формируем LIST такого типа:
4.JPG

Код: Выделить всё

! Window Structure
Window               WINDOW('Справочник материалов'),AT(,,644,301),FONT('MS Sans Serif',8,,FONT:regular,CHARSET:CYRILLIC),GRAY
                       LIST,AT(4,46,558,231),USE(?SprMatList),VSCROLL,FORMAT('9R|M*I~Flag~@S3@27R|M~Kod~C@N_6@150L|M~Name~C@s150@25L|M~NoGr~C(2)@s6@71L|M~BS~C' &|
   '@s20@80L(1)|M~Poluch~L(2)@s20@40R|M~Cena~L(2)@n10.2@'),FROM(SprMatQueue)
                       BUTTON('Добавить'),AT(577,47,45,14),USE(?InsertButton)
                       BUTTON('Изменить'),AT(577,69,45,14),USE(?ChangeButton)
                       BUTTON('Удалить'),AT(577,90,45,14),USE(?DeleteButton)
                       BUTTON('Просмотр'),AT(578,119,45,14),USE(?ViewtButton)
                       BUTTON('Закрыть'),AT(582,234,45,14),USE(?Close)
                       BUTTON('OK'),AT(197,284,35,14),USE(?OkButton),HIDE,DEFAULT
                     END

! [Priority 7500]
Коннектим, ОК, далее сама процедура:

Код: Выделить всё

SendQuery routine
  data
dstr  &idynstr
  code
  free(SprMatQueue)
  dstr &= newdynstr()
  setcursor(cursor:wait)

  open(sqlfile)

 dstr.cat('select Flag, Kod, Name, NoGr, BS, Poluch, Cena, SprMat_ID  from SprMat where Kod=716') ! Выбираю одну лишь запись, для теста
  sqlfile{prop:sql} = dstr.str()
  if error()
    stop(error() & fileerror())
  end

  loop
    next(sqlfile)
    if error() then break.
    SprMatQueue.Flag      = sqlfile.f1
    Message(clip(SprMatQueue.Flag))  ! Проверяю очередь – данные выводятся все правильно
    SprMatQueue.Kod       = sqlfile.f2
    Message(clip(SprMatQueue.Kod)) !ОК
    SprMatQueue.Name      = sqlfile.f3
    Message(clip(SprMatQueue.Name)) !ОК
    SprMatQueue.NoGr      = sqlfile.f4
    Message(clip(SprMatQueue.NoGr)) !ОК
    SprMatQueue.BS        = sqlfile.f5
    Message(clip(SprMatQueue.BS)) !ОК
    SprMatQueue.Poluch    = sqlfile.f6
    Message(clip(SprMatQueue.Poluch)) !ОК
    SprMatQueue.Cena      = sqlfile.f7
    Message(clip(SprMatQueue.Cena)) !ОК
    SprMatQueue.SprMat_ID = sqlfile.f8
    Message(clip(SprMatQueue.SprMat_ID)) !ОК
    add(SprMatQueue)
  end
  select(?SprMatList,1)
  select(?SprMatList)
  setcursor()
  dstr.release()
И на выходе имеем полную чепуху:
Жаль, нельзя приаттачить еще один файл, но смысл такой -
В поле Код выводится цена,
В поле Name выводится ID,
В поле Цена выводятся нули и всё.

То бишь, что – то выводится, что – то нет, а то, что выводится, попадает непонятно куда…

Пробовал описывать через виртуальный файл, как svru писал в топике:
http://forum.clarionlife.net/phpbb/view ... f=6&t=2114
Но, увы…
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Проблема с выводом в LIST из очереди

Сообщение kreator »

А вы попробуйте вместо sqlfile{prop:SQL} написать sprmat{prop:SQL}. Что получится? Меня, вообще, смущает, что на серваке таблица Teams имеет одно поле, да ещё и с типом int, а в словаре она имеет несколько полей с типом cstring. Так можно писать?
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение Yufil »

Хм... Лично я бы поле TeamId описал как строковое.
И не короче 256 символов

У меня это выглядит примерно так

CREATE TABLE [dbo].[FSTR] (
[STRVALUE] [varchar] (4000)
) ON [PRIMARY]
GO


ResMS FILE,DRIVER('MSSQL',PUB:DriverOptions),PRE(ResMS),NAME('FSTR'),Thread !,OWNER(GLO:WorkPathName)
Record RECORD,PRE()
Str CSTRING(4001),Name('Strvalue')
Str1 CSTRING(4001),Name('Strvalue')
Str2 CSTRING(4001),Name('Strvalue')
Str3 CSTRING(4001),Name('Strvalue')
Str4 CSTRING(4001),Name('Strvalue')
Str5 CSTRING(4001),Name('Strvalue')
Str6 CSTRING(4001),Name('Strvalue')
Str7 CSTRING(4001),Name('Strvalue')
Str8 CSTRING(4001),Name('Strvalue')
Str9 CSTRING(4001),Name('Strvalue')
Str10 CSTRING(4001),Name('Strvalue')
END
END

Достать поля из запроса (не очередь)

LoadQueueFromSQL('Select Year,IN_IND From $Config Where Ptr=1',,Glo:WorkYear,Loc:PUBIND)


PchQ2 QUEUE,PRE(PchQ2) !Поручения карточки
P_R_DATE CSTRING(20) !Подписано
Icon LONG !Иконка
CNT_DATE CSTRING(20) !дата контроля
VK CSTRING(11) !Вид контроля
DOC_DATE CSTRING(20) !дата исполнения поручения
P_I_Name CSTRING(51) !фамилия исполнителя/кому сопр.
PORUCH CSTRING(4001) !Поручение
PTR LONG !
TARG_DEP LONG !
END !

Достать очередь из запроса

LoadQueueFromSQL('Select p_i.Name, p.P_R_Date_S,P.CNT_Date_S,VK.VK,P.Doc_Date_s,P.Ptr,P.Targ_Dep, P.Poruch_type ' |
& ' From $Poruch p ' |
& ' Left Outer join $Vid_Kontr VK On VK.Ptr=P.VK_PTR ' |
& ' Left Outer join $P_I P_I On P_I.Ptr=P.P_I_PTR ' |
& ' Where .... , |
Pchq2,PchQ2:P_I_Name, PchQ2:P_R_DATE, PchQ2:CNT_DATE, PchQ2:VK, PchQ2:DOC_DATE, |
PchQ2:Ptr, PchQ2:Targ_Dep, PchQ2:Icon )


Символ '$' заменяется на что-нибудь подходящее, связанное с сервером (например, на 'dbo.' или пустую строку)
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение optron »

kreator писал(а):Меня, вообще, смущает, что на серваке таблица Teams имеет одно поле, да ещё и с типом int, а в словаре она имеет несколько полей с типом cstring. Так можно писать?
Не, Таблица Teams определена в словаре Клариона также с одним полем типа int. Это таблица sqlfile имеет структуру в 10 стринговых полей.
А вы попробуйте вместо sqlfile{prop:SQL} написать sprmat{prop:SQL}.
Сейчас попробую...
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение optron »

Yufil писал(а): У меня это выглядит примерно так ...
Наверное, так тоже можно.
Дело в том, что
Message(clip(SprMatQueue.Flag))
Message(clip(SprMatQueue.Kod))
Message(clip(SprMatQueue.Name))
Message(clip(SprMatQueue.NoGr))
Message(clip(SprMatQueue.BS))
Message(clip(SprMatQueue.Poluch))
Message(clip(SprMatQueue.Cena))
Message(clip(SprMatQueue.SprMat_ID))
Выводят то, что доктор прописал. А вот в LIST вставляются через пень колоду. Вернее, как я понимаю - числовые поля вставляются, стринговые - нет.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Проблема с выводом в LIST из очереди

Сообщение kreator »

По Вашему описанию не видно в словаре Teams. Но это не важно. Если аттрибут Name для sqlfile стоит Teams, Clarion понимает, что коннектиться надо к Teams.
Вопрос к Юрию. Действительно ли можно на SQL сервере создать таблицу с одним стринговым полем, а в словаре эту таблицу создать с соней полей и проблем не будет? Я выгружаю запросы именно так, но у меня таблица на сервере (типа временная) имеет много стринговых полей (столько же сколько и в словаре).
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение Yufil »

Ну, насчёт сотни не знаю, максимум 18, больше не входит в описание процедуры :)
А фрагменты, приведённые выше, из реальной проги.
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение optron »

kreator писал(а):По Вашему описанию не видно в словаре Teams. Но это не важно.
Не видно. Но, дело в том, что в словаре он есть, а вот в Sklad.clw он не включается почему - то.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение Yufil »

kreator писал(а):По Вашему описанию не видно в словаре Teams. Но это не важно. Если аттрибут Name для sqlfile стоит Teams, Clarion понимает, что коннектиться надо к Teams.
Я просто заметил, что в SQL-таблице Teams поле TeamId имеет тип Int(12), а принимается как String
Не в этом ли причина ?
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение optron »

kreator писал(а):А вы попробуйте вместо sqlfile{prop:SQL} написать sprmat{prop:SQL}. Что получится?
Всё то же самое, но на месте выводимых раньше числовых полей стоят ноли.

Код: Выделить всё

SendQuery routine
  data
dstr  &idynstr
  code
  free(SprMatQueue)
  dstr &= newdynstr()
  setcursor(cursor:wait)

  dstr.cat('select Flag, Kod, Name, NoGr, BS, Poluch, Cena, SprMat_ID  from SprMat where Kod=716')
  sprmat{prop:SQL}= dstr.str()
  if error()
    stop(error() & fileerror())
  end

  loop
    next(SprMat)
    if error() then break.
    SprMatQueue.Flag      = Sprmat.Flag
    SprMatQueue.Kod       = MAT:Kod
    SprMatQueue.Name      = MAT:Name
    SprMatQueue.NoGr      = MAT:NoGr
    SprMatQueue.BS        = MAT:BS
    SprMatQueue.Poluch    = MAT:Poluch
    SprMatQueue.Cena      = MAT:Cena
    SprMatQueue.SprMat_ID = MAT:SprMat_ID
    add(SprMatQueue)

    Message(MAT:Kod)
    Message(MAT:Name)
    Message(MAT:NoGr)

  end
  select(?SprMatList,1)
  select(?SprMatList)
  setcursor()
  dstr.release()
Мессэйджи выдают правильные рез - ты.
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение optron »

Yufil писал(а): Я просто заметил, что в SQL-таблице Teams поле TeamId имеет тип Int(12), а принимается как String
Не в этом ли причина ?
Нет, ИМХО, не в этом. До очереди они доходят.

Код: Выделить всё

Message(clip(SprMatQueue.Flag))
Message(clip(SprMatQueue.Kod))
Message(clip(SprMatQueue.Name))
Message(clip(SprMatQueue.NoGr))
Message(clip(SprMatQueue.BS))
Message(clip(SprMatQueue.Poluch))
Message(clip(SprMatQueue.Cena))
Message(clip(SprMatQueue.SprMat_ID))
Всё абсолютно верно. А вот вывод очереди в LIST не проходит.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение Yufil »

А потому что в листе поля должны быть в том же порядке, что и в очереди.
То, как мы их обозвали - лист игнорирует 3 раза.
Там прописывается номер поля (Field Number) или Auto, если нумерация стандартна.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Проблема с выводом в LIST из очереди

Сообщение kreator »

Тогда предполагаю вот что. Очередь формируется правильно, а list построенный на этой очереди выводит фигню. Да? Видел такое. Попробуй в листе отобразить все поля очереди, причём именно в их порядке декларации. Просто что может происходить. В описании list стоит from(SprMatQueue), и list вытягивает по порядку, начиная с первого.
We are hard at work… for you. :)
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение optron »

Для этого мне пришлось лищь добавить в лист поле Sprmat_ID.
Всё остальное по порядку соответствовало запросу и очереди.
В общем, бесполезно. То же самое.
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Проблема с выводом в LIST из очереди

Сообщение optron »

Вон оно чего, Михалыч...
У меня поле Flag было для того, чтобы его можно было в дальнейшем отмечать и иконку рисовать. Ну я и поставил его в Лист-е Color и Icon=normal. Убрал иконку и color и всё заработало)))
Ответить