:: Visual Foxpro, Foxpro for DOS
Количество параметров процедуры.
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Подскажите пожалуйста, есть ли ограничение на количество передаваемых параметров вызываемой процедуры? Пример:
SPrunSql(m.lnProjAid, m.lnPartAid, 0, m.lcIspName, m.lnQ, m.lcCex, m.lcFormat, m.lcN_rah, m.lnCina, m.ldDat_post, ;
m.lcZona, m.lcIzd, m.lcIzd_name, m.lnPrjlink_id, ;
m.lcIch, m.lcName, '', '', m.lcImbaseKey, m.lnDocId, m.lcFilename, m.lnSection, ;
m.lnPoz, m.lcNote, tcSql, "RunSql", tnField_IdIk, m.lcPki)
при компиляции программы, получаю ошибку:
Too many arguments
если убираю один параметр:
SPrunSql(m.lnProjAid, m.lnPartAid, 0, m.lcIspName, m.lnQ, m.lcCex, m.lcFormat, m.lcN_rah, m.lnCina, m.ldDat_post, ;
m.lcZona, m.lcIzd, m.lcIzd_name, m.lnPrjlink_id, ;
m.lcIch, m.lcName, '', '', m.lcImbaseKey, m.lnDocId, m.lcFilename, m.lnSection, ;
m.lnPoz, m.lcNote, tcSql, "RunSql", tnField_IdIk)
компиляция проходит без ошибок.
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
28.. Пардон, 26.

С Днём рождения кстати! Хоть слегка и опоздав.
Всех благ!




Исправлено 1 раз(а). Последнее : Taran, 30.01.20 18:01
Ratings: 0 negative/1 positive
Re: Количество параметров процедуры.
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Taran
28.
С Днём рождения кстати! Хоть слегка и опоздав.
Всех благ!
Спасибо! Неожиданно, но приятно!
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Так и есть, документация гласит:
Максимальное количество передаваемых параметров - 26
Что делать если так сложилась ситуация, когда надо больше?
Буду благодарен за совет.
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Либо в вызывающем куске создаешь массив, заполняешь и передаешь его по ссылке. Т.е. @

Либо, что мне больше нравится
Создаешь объект на основе empty и добавляешь на нем свойства с тебуемыми значениями. Тогда получаются именованные параметры.
Накладные расходы по времени надо смотреть.
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
hztp_serg
Автор

Сообщений: 577
Откуда: Хмельницкий
Дата регистрации: 19.06.2007
Принцип понятен, буду пробовать.
Спасибо большое!
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Просто как вариант - не передавать всю кучу значений как параметры, а пользоваться внешними объектами - PRIVATE-переменными, свойствами внешних объектов, полями таблиц/курсоров.

Иногда, особенно в уже готовом большом приложении, бывает лень (или не хватает времени) сделать все "по уму" и проще/быстрее добавить пару внешних переменных в требуемое место, чем проводить ревизию всей кучи вызовов данной функции.

Появится время/желание - переделать "нормально".

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



Исправлено 1 раз(а). Последнее : akvvohinc, 30.01.20 19:17
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Была у меня такая "проблема" - коллеги посоветовали или подход поменять, или параметры строкой передавать, или массивом. Выбрал первое.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
akvvohinc
Просто как вариант - не передавать всю кучу значений как параметры, а пользоваться внешними объектами - PRIVATE-переменными, свойствами внешних объектов, полями таблиц/курсоров.

Зачем плохому учить?
Ищи потом по всему проекту связи.
Функция должна быть максимально изолирована и оперировать только явно заданными параметрами.
Ну максимум если это метод класса, то свойствами класса.

Параметров конечно многовато. Но тут можно много говорить о подходе. А оно надо?
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
Либо иммитировать си-шную структуру/структуры типа:

LOCAL loMyStruct
loMyStruct = Createobject('MyStruct')
loMyStruct.lnProjAid = 1
loMyStruct.lnPartAid = 2
loMyStruct.lnParam = 3
loMyStruct.lcIspName = "4"
loMyStruct.lnQ = 5
loMyStruct.lcCex = "6"
loMyStruct.lcFormat = "7"
loMyStruct.lcN_rah = "8"
loMyStruct.lnCina = 9
loMyStruct.ldDat_post = 10
loMyStruct.lcZona = "11"
loMyStruct.lcIzd = "12"
loMyStruct.lcIzd_name = "13"
loMyStruct.lnPrjlink_id = 14
loMyStruct.lcIch = "15"
loMyStruct.lcName = "16"
loMyStruct.lcParam = "17"
loMyStruct.lcParam2 = "18"
loMyStruct.lcImbaseKey = "19"
loMyStruct.lnDocId = 20
loMyStruct.lcFilename = "21"
loMyStruct.lnSection = 22
loMyStruct.lnPoz = 23
loMyStruct.lcNote = "24"
loMyStruct.tcSql = "25"
loMyStruct.RunSql = "26"
loMyStruct.tnField_IdIk = 27
loMyStruct.lcPki = "28"
SPrunSql(loMyStruct)
Return
Define Class MyStruct As custom
lnProjAid = 0
lnPartAid = 0
lnParam = 0
lcIspName = ""
lnQ = 0
lcCex = ""
lcFormat = ""
lcN_rah = ""
lnCina = 0
ldDat_post = 0
lcZona = ""
lcIzd = ""
lcIzd_name = ""
lnPrjlink_id = 0
lcIch = ""
lcName = ""
lcParam = ""
lcParam2 = ""
lcImbaseKey = ""
lnDocId = 0
lcFilename = ""
lnSection = 0
lnPoz = 0
lcNote = ""
tcSql = ""
RunSql = ""
tnField_IdIk = 0
lcPki = ""
Enddefine
Function SPrunSql(oParam)
? oParam.lnProjAid
? oParam.lnPartAid
? oParam.lnParam
? oParam.lcIspName
? oParam.lnQ
? oParam.lcCex
? oParam.lcFormat
? oParam.lcN_rah
? oParam.lnCina
? oParam.ldDat_post
? oParam.lcZona
? oParam.lcIzd
? oParam.lcIzd_name
? oParam.lnPrjlink_id
? oParam.lcIch
? oParam.lcName
? oParam.lcParam
? oParam.lcParam2
? oParam.lcImbaseKey
? oParam.lnDocId
? oParam.lcFilename
? oParam.lnSection
? oParam.lnPoz
? oParam.lcNote
? oParam.tcSql
? oParam.RunSql
? oParam.tnField_IdIk
? oParam.lcPki
Endfun
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Мне кажется интересной идея создать класс на базе Custom (или Empty) и все передаваемые параметры передавать через свойства этого объекта.

Есть еще такая идейка - сформировать текст запроса в том месте, откуда идет попытка вызвать процедуру с большим числом параметров, например так:

TEXT TO lcText TEXTMERGE NOSHOW PRETEXT 1+4
SELECT t1.field1, t2.field2, t3.field3, t4.field4
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id=t2.id
LEFT JOIN table3 t2 ON t1.id=t3.id
LEFT JOIN table5 t2 ON t1.id=t4.id
WHERE t1.projid=<<m.lnProjAid>>
AND t1.partid=<<m.lnPartAid>>
AND t1.field10=0
AND t2.isp='<<m.lcIspName>>'
AND t2.q=<<m.lnQ>>
AND t3.cex='<<m.lcCex>>'
AND t4.format='<<m.lcFormat>>'
AND t4.nrah='<<m.lcN_rah>>'
AND t3.cena=<<m.lnCina>>
AND t3.datepost=m.ldDat_post
AND t3.zone='<<m.lcZona>>'
AND t3.izd='<<m.lcIzd>>'
AND t3.izd_name='<<m.lcIzd_name<<'
AND t1.ptjlink_od=<<m.lnPrjlink_id>>
AND t1.ich='<<m.lcIch>>'
AND t2.name='<<m.lcName>>'
AND t3.st=''
AND t4.rt=''
AND t1.imbase_key='<<m.lcImbaseKey>>'
AND t1.doc_id=<<m.lnDocId>>
AND t1.filename='<<m.lcFilename>>'
AND t1.section=<<m.lnSection>>
AND t2.poz=<<m.lnPoz>>
AND t2.note='<<m.lcNote>>'
ENDTEXT

и передать его в процедуру одной строкой. Раз это ИНТЕРМЕХ ;) - то там относительно небольшие объемы данных в базах - если сравнивать с биллингом телекоммуникационных компаний или с операциями банка).


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
_vit
Либо иммитировать си-шную структуру/структуры типа:

Именно про это и писал, и тоже на Custom!


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
sphinx
_vit
Либо иммитировать си-шную структуру/структуры типа:

Именно про это и писал, и тоже на Custom!

В структурах указывается тип данных, не значения.
В Фоксе для таких целей предназначен уже упоминавшийся класс EMPTY:
loEmpty = CREATEOBJECT('Empty')
ADDPROPERTY(loEmpty,'prop1',luValue1)
***
ADDPROPERTY(loEmpty,'prop32',luValue32)

ЗЫ. С другой стороны, функцию с количеством передаваемых параметров более десятка в VFP надо еще умудриться написать.



Исправлено 3 раз(а). Последнее : lulgu, 30.01.20 23:37
Ratings: 1 negative/0 positive
Re: Количество параметров процедуры.
Burn

Сообщений: 5640
Откуда: Днепр
Дата регистрации: 02.01.2002
Я предпочитаю создавать курсор и передавать его имя - все таки у нас СУБД с найтивными таблицами а не какое-то Си со структурами



Исправлено 1 раз(а). Последнее : Burn, 30.01.20 23:48
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Burn
Я предпочитаю создавать курсор и передавать его имя - все таки у нас СУБД с найтивными таблицами а не какое-то Си со структурами

Вы также путаетесь в понятиях.
В данном случае речь идет о передаче параметров, курсоров не напасетесь.

Что касается структур, то в других языках они записываются в текстовом виде.
Аналогично запишите структуры в текстовом формате, напишите функцию для работы с ними, и вы также сможете работать со структурами как в каком-то СИ, при необходимости.
Ratings: 1 negative/0 positive
Re: Количество параметров процедуры.
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
lulgu
В данном случае речь идет о передаче параметров, курсоров не напасетесь.

Maximum # of tables open at one time - 65535.

А сколько в среднем ожидается функций с числом параметров более максимума?
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Taran
Пардон, 26.
.
Кстати, несмотря на написанное в хелпе ограничение на число параметров, я когда-то проверял это значение - оно равно 27 (в FPD оно было равно 25, если я не ошибаюсь)

А вообще, если говорить строго, то число параметров у функции может быть гораздо большим, чем 27 (не выяснял, есть ли ограничение, а если есть, то чему оно равно).
Но передать в функцию более 27 аргументов пока не получалось.
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
akvvohinc
lulgu
В данном случае речь идет о передаче параметров, курсоров не напасетесь.

Maximum # of tables open at one time - 65535.

А сколько в среднем ожидается функций с числом параметров более максимума?

Ну, столько вам не понадобится.
После пары курсоров расскажете, как решаете нюансы с разными типами данных, передачей параметров по ссылке, с массивами, объектами и т.п..
Параметры они ведь в фоксе "резиновые", а поля в курсоре нет.
Например, простое - какова будет длина поля для параметров типа "имя файла"?
Вряд ли курсор будет альтернативой классу EMPTY, проще некуда.
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
lulgu
После пары курсоров расскажете, как решаете нюансы с разными типами данных, передачей параметров по ссылке, с массивами, объектами и т.п..
Параметры они ведь в фоксе "резиновые", а поля в курсоре нет.
Например, простое - какова будет длина поля для параметров типа "имя файла"?
Вряд ли курсор будет альтернативой классу EMPTY, проще некуда.

Всё это вполне решалось как-то в FPD, когда этой альтернативы не было.
Например, знать длину поля для параметра типа "имя файла" не нужно, запишем его в memo.
Передача по ссылке? - автор сам решает, менять ему значения полей или нет.
Массив? Ссылки на объекты? - то, что нельзя или неудобно - передаем как обычный параметр.

Через таблицы же мог вестись и обмен данными между приложениями на FPD и VFP.

Но я и не призывал к обязательному использованию курсоров для передачи "параметров", не писал, что это лучше или не хуже - просто в большинстве ситуаций (простой набор большого количества скалярных переменных) особой разницы нет, а заполнить поля таблицы/курсора значениями одноименных переменных, а затем "бросить" их обратно - программирования не требует.
Необходимость задавать типы полей? Вспомнить тип передаваемых параметров лишним не будет, а иногда и поможет избежать ошибок.
Ratings: 0 negative/0 positive
Re: Количество параметров процедуры.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Использовать курсоры для передачи параметров в процедуры - 100% говнокод.
Даже массивом по ссылке их передать и то выглядит гораздо лучше. Или в мега-строку напихать (хоть бы из того-же курсора существующего в точке вызова при помощи CursorToXML).
Встраивать параметры в строку запроса в виде теста - это SQL иньекция - так делать не следует. Следует использовать параметры как параметры. А если уж по какой-то причине только так, то как минимум нужно подставляемую строку "очистить" от потенциально небезопасных символов или конструкций - если она хоть каким-то образом получается от пользователя, а не забита в коде программы (для запроса к фоксовым таблицам - от макросов, кавычек, вызовов функций и т.п.)


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 14 vasili_u NSF Guest (Гостей: 11)

© 2000-2024 Fox Club 
Яндекс.Метрика