:: Visual Foxpro, Foxpro for DOS
Re: Возврат массива из метода
of63

Сообщений: 26001
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
akvvohinc
Vedmak
Никогда не использую передачу массива в функцию, только через указатели
А есть способ передать массив иначе?

Не придирайся. В фоксе конечно есть, есть определение зоны действия переменной, например PRIVATE
Можно передать в функцию имя массива, в C-параметре
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
В фоксе конечно есть, есть определение зоны действия переменной, например PRIVATE
Можно передать в функцию имя массива, в C-параметре
Всё перечисленное не является передачей массива в функцию:
1) "определение зоны действия переменной, например PRIVATE" - здесь ты вообще ничего не передаешь;
2) "можно передать в функцию имя массива" - здесь ты сам написал, что именно ты передаешь - имя массива, но не массив.
Ratings: 0 negative/1 positive
Re: Возврат массива из метода
Владимир Максимов

Сообщений: 14146
Откуда: Москва
Дата регистрации: 02.09.2000
akvvohinc
Владимир Максимов
Кроме того, для FoxPro есть проблема "пустого" массива (без элементов). Т.е. нужен дополнительный контроль полученного значения, а это проще всего сделать именно что предварительно подготовив массив.
Ещё раз уточню, что в MakeArray() никакой массив не передается.
А результат работы этой функции ("пустой" массив или нет) - retvalue - можно вернуть в команде RETURN:
retvalue = MakeArray(@MyArray)

ALINES(array, ...) тоже возвращает значение размерности созданного массива.
О каком ещё дополнительном контроле речь?

Вы исходите из предположения, что существует некое универсальное решение, применимое всегда. В общем случае, даже для специализированных языков программирования - это не так. Не говоря уже о FoxPro, которое представляет из себя "сборную солянку" из разных подходов.

Команда SELECT ... INTO ARRAY ...

Здесь у Вас нет возможности получить некий retvalue, чтобы уточнить, было получено значение, путь и пустое, или не было никакого значения

Наиболее простой способ это понять - предварительное формирование массива

dimension myArray(1)
myArray[1] = .t.
select ... from ... into array myArray
if type("myArray(1)") = 'L'
* Выборка ничего не вернула
endif

С командой Select-SQL пример наглядный и всем понятный. Но все то же самое применимо и для любой другой функции работы с массивом. Просто там обычно очень сильно зависит от контекста задачи.

Ну, например, тот же Alines(). Здесь понятно, что хотя бы один элемент массива будет всегда. Пусть и пустой. Что-то же в качестве строки для разбора было передано. Т.е. значение null не предполагается самой постановкой задачи. По этой причине Ваш подход "переопределять всегда" именно в данном конкретном случае будет уместен. Контекст использования именно данной функции такое допускает.

Для функций вроде ADatabases() или AUsed() есть значение retvalue по которому можно судить о результате

Но, в общем случае, нет универсального решения. В каждом конкретном случае надо разбираться отдельно. Не всегда есть возможность и необходимость вернуть дополнительный признак retvalue
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
lemenev
Автор

Сообщений: 229
Дата регистрации: 23.06.2022
Владимир Максимов
Команда SELECT ... INTO ARRAY ...
Здесь у Вас нет возможности получить некий retvalue, чтобы уточнить, было получено значение, путь и пустое, или не было никакого значения

А как же _TALLY ?
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
of63

Сообщений: 26001
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Команда SELECT ... INTO ARRAY ...
> Здесь у Вас нет возможности получить некий retvalue, чтобы уточнить, было получено значение, путь и пустое, или не было никакого значения

Есть _TALLY - количество записей, полученных после "групповой" операции.

Доб Упс. Леменев первый на страже понятий! )



Исправлено 1 раз(а). Последнее : of63, 22.12.24 17:40
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
of63

Сообщений: 26001
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
[quote lemenev][quote Владимир Максимов]Команда SELECT ... INTO ARRAY ...

FULL JOIN - он дает " было получено значение, путь и пустое, или не было никакого значения". Это все "просто" (о вопросе найден/не найден, основная трахатория это о "сумма отличается на 1 коп, почему? расскажи как ты насчитал этот 1 млн - без 1 коп? украл её ?) " Это серьезно, наще гос бережет народную копеечку. )
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
С командой Select-SQL пример наглядный и всем понятный.
Нет, эта команда - никакой не пример, ведь мы обсуждали вызов функции, причем, изначально именно моей функции, а затем уже ALINES().
Я и написал, что в этих случаях не надо ничего создавать заранее и дополнительно контролировать.
Но если где-то в программе вы обнаружите какую-то "неоднозначность с массивом", то ради бога - устраняйте её, кто ж против?

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

Цитата:
Но все то же самое применимо и для любой другой функции работы с массивом.
Тогда приведите пример такой функции.
И если она существует, то и контролируйте массив, который она принимает или возвращает.
Но при чём здесь остальные функции?

Цитата:
Но, в общем случае, нет универсального решения. В каждом конкретном случае надо разбираться отдельно.
Может, я чего-то и не заметил, но я не помню, где я написал о каком-то решении как универсальном.
Если возможно, то приведите цитату, на основании которой вы сделали такой вывод.



Исправлено 1 раз(а). Последнее : akvvohinc, 22.12.24 19:23
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
Наиболее простой способ это понять - предварительное формирование массива
dimension myArray(1)
myArray[1] = .t.
select ... from ... into array myArray
if type("myArray(1)") = 'L'
* Выборка ничего не вернула
endif
Давайте проверим этот способ:
CREATE CURSOR cursor1 (field1 L)
INSERT INTO cursor1 VALUES (.T.)
INSERT INTO cursor1 VALUES (.F.)
DIMENSION myArray(1)
myArray[1] = .T.
SELECT * FROM cursor1 INTO ARRAY myArray
IF TYPE("myArray(1)")='L'
* Выборка ничего не вернула ?
? IIF(_TALLY=0,'Выборка ничего не вернула','Выборка вернула '+TRAN(_TALLY)+' зап.')
ENDIF
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
lemenev
А как же _TALLY ?
Да, и в примечании к опции INTO ARRAY <array> так и написано:
Цитата:
Note. If the SQL SELECT statement does not return any records, an existing array remains unchanged and may contain previous results. If an array does not exist, the command does not create one. Consider using the _TALLY System Variable to determine if a SQL SELECT statement returns any records.



Исправлено 1 раз(а). Последнее : akvvohinc, 22.12.24 20:00
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
of63

Сообщений: 26001
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Переведи как ты понял
Я понимаю как - количество возвращенных записей

Почитай про _TALLY, это хорошая внутрифоксовая глобальная переменная, и другие тоже. Ребята прогеры фокса тоже были озабочены отладкой своей конструкции, и неломыслиями, и вот остатки - _* и SYS(*)



Исправлено 2 раз(а). Последнее : of63, 22.12.24 20:29
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Я понимаю как - количество возвращенных записей
Здесь про количество не написано - только о том, что посредством этой переменной можно узнать, возвратила ли команда хоть какое-то их количество.
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
например, тот же Alines(). Здесь понятно, что хотя бы один элемент массива будет всегда. Пусть и пустой. Что-то же в качестве строки для разбора было передано. Т.е. значение null не предполагается самой постановкой задачи.
1) Мне понятно, что "хотя бы один элемент массива будет всегда", только потому, что так написано в описании функции. Но разработчики могли реализовать и другое её поведение.

2) По поводу null всё с точностью до наоборот - это значение предполагается "самой постановкой задачи".
(хотя мне и не совсем понятно, что вы подразумеваете здесь под "постановкой задачи")
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
of63

Сообщений: 26001
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
akvvohinc
Цитата:
Я понимаю как - количество возвращенных записей
Здесь про количество не написано - только о том, что посредством этой переменной можно узнать, возвратила ли команда хоть какое-то их количество.

Практика показала, что _TALLY точно имеет значение 0...N - количество обработанных (возвращенных) записей после некоторых групповых операторов Fox. Список этих операторов - в описании фокса.
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
PaulWist

Сообщений: 14740
Дата регистрации: 01.04.2004
Добавлю код для более точного определения, что такое _TALLY


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
lemenev
Автор

Сообщений: 229
Дата регистрации: 23.06.2022
PaulWist, в твоём примере происходит явное добавление в одну таблицу и неявное (в функции) в другую. Что ты хотел увидеть в _Tally? По-своему это верно. Тебе показывают, сколько всего добавилось строк в обе таблицы. Другой разговор, что с этой информацией делать.

Пример интересный. Я такого применения не знал.

Мне кажется, что в команде
CREATE CURSOR test (f1 int, CHECK Logs(f1))
запятая лишняя. Хотя всё работает. Странно.



Исправлено 1 раз(а). Последнее : lemenev, 27.12.24 12:28
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
PaulWist

Сообщений: 14740
Дата регистрации: 01.04.2004
lemenev
Павел, в твоём примере происходит явное добавление в одну таблицу и неявное (в функции) в другую. Что ты хотел увидеть в _Tally? По-своему это верно. Тебе показывают, сколько всего добавилось строк в обе таблицы. Другой разговор, что с этой информацией делать.

Это пример того, что _Tally только в частном случае показывает сколько выбрано записей.

lemenev

Мне кажется, что в команде
CREATE CURSOR test (f1 int, CHECK Logs(f1))
запятая лишняя. Хотя всё работает. Странно.

Лишняя запятая - говорит о том, что используется правило записи, те когда вся запись модифицирована (те все поля перечисленные в update помещены в запись), то следующим действием вызывается правило поля.

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


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
lemenev
Автор

Сообщений: 229
Дата регистрации: 23.06.2022
Спасибо за разъяснение. Но в Help об этом ничего нет: help.foxclub.ru
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
lemenev
Спасибо за разъяснение. Но в Help об этом ничего нет
В Help, действительно, нет.
Но на деле получается, что можно у каждого поля таблицы использовать Check этого поля, и в любое место списка полей добавить ещё один (и только один) Check записи.

Например, так
CREATE CURSOR test (field1 int CHECK Func_f1(), CHECK Func_Rec(), field2 int CHECK Func_f2())

lemenev
Тебе показывают, сколько всего добавилось строк в обе таблицы.
Похоже, что почти так, но логика, видимо, несколько сложнее.

В том примере показывается не общее количество записей, добавленное этой командой в Test и Logs, а то количество, которое было добавлено в обе таблицы при добавлении последней из нескольких записей, добавляемых в Test (в том примере добавлялась всего одна запись, и поэтому логика была до конца не видна).

Что это значит.
Допустим, команда INSERT INTO Test добавит 5 записей в эту таблицу.
Значит, Check-функция будет вызвана последовательно 5 раз.
То есть на последнем, пятом шаге будет:
1) обнулена _TALLY (из-за нового SELECT SQL);
2) добавлено, допустим, 10 записей в таблицу Logs;
3) добавлена 1 запись в таблицу Test

В результате _TALLY после этой команды будет равна 11.

Но дело даже не в том, сколько записей добавлено в Logs, а в том количестве записей, которое возвращает команда SELECT внутри Check-функции.
То есть если INSERT в ней убрать, а оставить только тот SELECT, то _TALLY всё равно вернёт 11.

Итого формула для _TALLY в этом случае у меня получилась такой:
0 + (результат SELECT UNION при последнем вызове Check-функции) + 1

Если же внутри Check-функции никаких других SELECT выполняться не будет, то нечему будет сбрасывать предыдущее значение _TALLY - в результате _TALLY и покажет количество записей, добавленных в Test.
(при этом можно увидеть, как после каждого вызова Check() _TALLY увеличивается на 1) .

PaulWist
фокс укладывает новые значения в поля последовательно
Этот верно лишь в тех случаях, когда в команде добавления указаны все поля (или все поля подразумеваются - как в APPEND BLANK)

Если же в команде INSERT INTO указать лишь часть полей, то сначала выполнятся Check-функции этих полей (в порядке их физического расположения в таблице), а лишь затем функции для остальных полей (тоже в порядке их физического расположения в таблице).

А если учесть, что внутри Check-функций могут быть команды (например, REPLACE), изменяющие значения других полей таблицы, то порядок, в котором Фокс укладывает новые значения в поля, может быть вообще "произвольным".



Исправлено 6 раз(а). Последнее : akvvohinc, 28.12.24 06:55
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
krin

Сообщений: 190
Дата регистрации: 08.02.2005
akvvohinc
lemenev
Спасибо за разъяснение. Но в Help об этом ничего нет
В Help, действительно, нет.
Но на деле получается, что можно у каждого поля таблицы использовать Check этого поля, и в любое место списка полей добавить ещё один (и только один) Check записи.

читаем хелп CREATE TABLE - SQL Command в части table validation rule
а в CREATE CURSOR действительно об этом нет. и тянется это по крайней мере с VFP5 Help. но всегда есть "читай также CREATE TABLE"
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
lemenev
Автор

Сообщений: 229
Дата регистрации: 23.06.2022
krin
читаем хелп CREATE TABLE - SQL Command

В Help по CREATE TABLE - SQL Command написано:
CHECK lExpression1 
Указывает правило проверки для поля. Параметр lExpression1 должен оцениваться в логическое выражение
 и может представляет собой пользовательскую функцию или хранимую процедуру. Visual FoxPro проверяет
 правило проверки, указанное в опции CHECK при добавлении пустой записи.

CHECK lExpression2 
Указывает правило проверки для таблицы. Параметр lExpression2 должен оцениваться в логическое выражение
 и может представлять собой пользовательскую функцию или хранимую процедуру.
Это не очень соотносится с практикой.
Ratings: 0 negative/0 positive


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

On-line: 18 (Гостей: 18)

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