powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Курсор
18 сообщений из 18, страница 1 из 1
Курсор
    #38031792
Иухенио
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужна помощь плиз!!! Есть две переменные, одна хранит название таблицы вторая хранит название одного поля из таблицы. В обычном случае мы вытаскиваем значение следующим образом: Table1.Field1.
Возможно ли вытащить значение из этой таблицы и этого поля обратившись через эти две переменные?
...
Рейтинг: 0 / 0
Курсор
    #38031817
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
cTable='Table1'
cField='Field1'


Если не опасаетесь использовать макроподстановку
Код: sql
1.
?&cTable..&cField


Более правильно
Код: sql
1.
?EVALUATE(cTable+'.'+cField)
...
Рейтинг: 0 / 0
Курсор
    #38031827
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иухенио,

+1
или так:
Код: plsql
1.
EVALUATE(cTable+'->'+cField)
...
Рейтинг: 0 / 0
Курсор
    #38031849
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM[src]Если не опасаетесь использовать макроподстановкуА почему ее надо опасаться? Еще не помню случая, чтобы мп глючила. Другой вопрос, всегда ли оправдано ее использование...
...
Рейтинг: 0 / 0
Курсор
    #38031870
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonny540Еще не помню случая, чтобы мп глючила"Бездумный копипаст приводит к задумчивости" (Ц)
Это как раз с МП в Фоксе очень хорошо соотносится...
...
Рейтинг: 0 / 0
Курсор
    #38031876
Иухенио
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все заработало! Спасибо большое! Очень помогло!
...
Рейтинг: 0 / 0
Курсор
    #38031880
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По возможности, следует избегать написание кода, в котором имена полей и таблиц хранятся в переменных. Не стоит стремиться писать универсальный код "на все случаи жизни". В большинстве случаев, в этом нет необходимости.

Кроме того, есть различные способы "макроподстановок". В зависимсоти от конкретной задачи. Подробнее можно почитать здесь

Макроподстановка
...
Рейтинг: 0 / 0
Курсор
    #38031898
Иухенио
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,
Целиком и полностью с тобой согласен, но в моем случае название таблицы и полей меняются динамически. Если в двух словах пишу конвертер из DBF в MYSQL, соответственно таблицы все выбираются в процессе выполнения программы, названия полей у всех разные, поэтому и пришлось использовать переменные.
...
Рейтинг: 0 / 0
Курсор
    #38031975
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как это "названия таблиц и полей меняются динамически"? В процессе?
Не проще ли структуры отбирать опять же в таблицы/курсоры... на крайний случай - есть же afields() и т.п.
И вообще, если вы, например, используете OLEDB/ODBC для связки, то зачем вам вычисления полей? - вы же таблицы можете просто переливать as is
...
Рейтинг: 0 / 0
Курсор
    #38032087
Иухенио
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДА у меня БД лежит на MySQL, приложение пишу на FOX PRO, связь через ODBC. Алгоритм следующий: Выбирается таблица DBF (GetFILE()), затем считываю ее структуру в курсор1, затем выбираю БД и таблицу на MySQL (два ComboBox'а). После чего в Grid'е настраиваю соответствие полей. Т.е. в гриде 5 колонок, первая CheckBox'ы, вторая и третья обычные Text, четвертая Combobox, пятая обычный Text. В первой колонке с помощью checkbox'ов отмечаю какие поля будут участвовать в обмене, во второй и третьей название поля и тип поля SQL таблицы, в четвертой колонке находятся ComboBox'ы, с помощью них выбираю какое поле DBF таблицы будет записано в данное поле SQL таблицы, ну и при выборе значения в CMB, в последней колонке появляется тип выбранного поля. После того как установлено соответствие полей двух таблиц, результат сохраняю в курсоре. И уже организовываю цикл, в котором формируется запрос на запись данных в SQL таблицу. В этом же цикле, как раз и участвуют эти переменные, хранящие название таблицы и поля таблицы.
...
Рейтинг: 0 / 0
Курсор
    #38032428
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно нет смысла. Ведь для того, чтобы передать данные на сервер надо будет сформировать команду для вставки в функцию SQLExec(). Но физически, такая команда - это символьная строка. Ну, условно говоря, Вам надо сформировать строку вида

Код: sql
1.
2.
3.
lcString = "insert into MyTabSQL (Field1, Field2) values (?MyTable.Field1, ?MyTable.Field2)"
select MyTable
=SQLExec(m.lnCH, m.lcString)


Т.е. здесь просто нет места для макроподстановки. Вы формируете символьную строку. "Вытаскивать" имена полей из метаданных нет необходимости. Это сделает сам FoxPro по символу вопросительного знака

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
lcSQLTable = "MyTabSQL"
lcSQLField1 = "Field1"
lcSQLField2 = "Field2"

lcDBFTable = "MyTable"
lcDBFField1 = "Field1"
lcDBFField2 = "Field2"

* Формируем команду для SQLExec
lcString = "insert into " + m.lcSQLTable + ;
        " (" + m.lcSQLField1 + ", " + lcSQLField1 + ")" + ;
        " values" + ;
        " (?" + m.lcDBFTable + "." + lcDBFField1 + ", ?" + m.lcDBFTable + "." + lcDBFField2 + ")"

* Выполняем
=SQLExec(m.lnCH, lcString)


Получать конкретные значения из полей, описанных в метаданных через макроподстановку просто нет необходимости
...
Рейтинг: 0 / 0
Курсор
    #38032514
Иухенио
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,
Я извинюсь заранее, если вдруг что не то ляпну, я Fox Pro не так давно начал изучать. Но в данном примере в строке запроса которая формируется, за пишутся же ведь сами названия полей, а не их значения. Т.е. результат будет таков:

lcString = "insert into MyTabSQL (Field1, Field2) VALUES (MyTable.Field1, MyTable.Field2)
...
Рейтинг: 0 / 0
Курсор
    #38032584
Sea_Cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иухенио,
На самом деле будет:
Код: php
1.
lcString = "insert into MyTabSQL (Field1, Field2) VALUES (?MyTable.Field1, ?MyTable.Field2)


Знак вопроса - это указание драйверу ODBC подставить вместо имени поля (переменной, выражения) его значение.
...
Рейтинг: 0 / 0
Курсор
    #38032603
Иухенио
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sea_Cat,
А вот про это не знал. Я до этого делал таким образом, что у меня строка с запросом функции SQLEXEC передавалась сразу со значениями. А на скорость выполнения запросов такой способ не повлияет? а то у меня самая большая таблица содержит чуть менее 3,5 млн записей?
...
Рейтинг: 0 / 0
Курсор
    #38033253
Pulsar_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМПо возможности, следует избегать написание кода, в котором имена полей и таблиц хранятся в переменных. Не стоит стремиться писать универсальный код "на все случаи жизни". В большинстве случаев, в этом нет необходимости.

Кроме того, есть различные способы "макроподстановок". В зависимсоти от конкретной задачи. Подробнее можно почитать здесь

Макроподстановка

Раз уж речь зашла о макроподстановках:

Владимир, если я правильно понял из этой статьи, макроподстановок следует избегать лишь потому, что в них легко запутаться?
Это единственная причина?
Вот фрагмент кода моей программы:
********************************************************************
dopusl_baza_graj=[a.graj=gr1.kodstrana]
dopusl_baza_stranamr=[a.stranamr=st1.kodstrana]
dopusl_baza_mrozh=[a.mrozh=ob1.kodobl]
dopusl_baza_stranaadrv=[a.stranaadrv=st2.kodstrana]
dopusl_baza_adrv=[a.adrv=ob2.kodobl]
dopusl_baza_codif_38=[str(38)+str(a.krotn)=str(c1.vikod)+str(c1.shusl)]
dopusl_baza_codif_47=[str(47)+str(a.vdp)=str(c2.vikod)+str(c2.shusl)]
dopusl_baza_codif_44=[str(44)+str(a.kotsu)=str(c3.vikod)+str(c3.shusl)]
dopusl_baza_codif_92=[str(92)+str(a.koddok)=str(c4.vikod)+str(c4.shusl)]
dopusl_baza_codif_45=[str(45)+str(a.koddok)=str(c5.vikod)+str(c5.shusl)]
dopusl_baza_codif_42=[str(42)+str(a.koddok)=str(c6.vikod)+str(c6.shusl)]

SELECT a.*, ;
IIF(a.krotn=75,1.5,a.krotn+0.1) krotnsort,;
IIF(a.tipnmv=1,[г.],[н/п]) chrtipnmv,;
vich_adr_pribptz(a.nmnvptz) chradrprib,;
NVL(gr1.strana,SPACE(40)) chrgraj,;
NVL(st1.strana,SPACE(40)) chrstranamr,;
NVL(ob1.obl,SPACE(40)) chrmrozh,;
NVL(st2.strana,SPACE(40)) chrstranaadrv,;
NVL(ob2.obl,SPACE(40)) chradrv,;
NVL(c1.nmusl,SPACE(80)) rodotn,;
NVL(c1.nmusl,SPACE(80)) newrodotn,;
NVL(c2.nmusl,SPACE(80)) chrvdp,;
NVL(c3.nmusl,SPACE(80)) chrkotsu,;
NVL(c4.nmusl,SPACE(80)) chrkoddok,;
NVL(c5.nmusl,SPACE(80)) chrspol,;
NVL(c6.nmusl,SPACE(80)) chrprvo;
FROM predvbaza a ;
LEFT JOIN strana gr1;
ON &dopusl_baza_graj;
LEFT JOIN strana st1;
ON &dopusl_baza_stranamr;
LEFT JOIN obl ob1;
ON &dopusl_baza_mrozh;
LEFT JOIN strana st2;
ON &dopusl_baza_stranaadrv;
LEFT JOIN obl ob2;
ON &dopusl_baza_adrv;
LEFT JOIN codif c1;
ON &dopusl_baza_codif_38;
LEFT JOIN codif c2;
ON &dopusl_baza_codif_47;
LEFT JOIN codif c3;
ON &dopusl_baza_codif_44;
LEFT JOIN codif c4;
ON &dopusl_baza_codif_92;
LEFT JOIN codif c5;
ON &dopusl_baza_codif_45;
LEFT JOIN codif c6;
ON &dopusl_baza_codif_42;
INTO CURSOR predvbaza READWRITE
***********************************************************************************************
Это несложный запрос, есть гораздо запутаннее, с бОльшим количеством МП.
Можно, конечно, вместо МП вставить обычный код, но мне так реально легче ориентироваться. Почему? Условия отбора меняются, и мне проще менять значения переменных, а сам запрос при этом не трогать.
В документации по Фоксу я читал, что МП работают медленнее, чем обычный код, но это (если я правильно понял) при выполнении МП в цикле.
Есть ли реальные причины избегать МП?
...
Рейтинг: 0 / 0
Курсор
    #38033795
Sea_Cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иухенио,
На быстродействие программы это никак не влияет, это не макроподстановка, а обычная передача параметров по значению (а не по ссылке, как это по умолчанию принято в Foxpro).
Если SQL запрос выполняется локально - в среде FoxPro, то знак вопроса обычно не используется, так как встроенному интерпретатору запросов доступны все переменные и поля таблиц. Но для удаленного сервера требуется только передача параметров по значению.
...
Рейтинг: 0 / 0
Курсор
    #38034883
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pulsar_pРаз уж речь зашла о макроподстановках:

Владимир, если я правильно понял из этой статьи, макроподстановок следует избегать лишь потому, что в них легко запутаться?
Это единственная причина?
Не единственная, но основная.

Мало написать код один раз. Надо написать его так, чтобы если Вы вернетесь к нему через месяц..два, то Вам (или другому программисту) не понадобился бы еще один месяц, чтобы понять, а что же здесь написано и как это все можно модифицировать. Макроподстановка - это один из приемов, который сильно усложняет понимание кода.

Pulsar_pВот фрагмент кода моей программы:
Если Вы дочитали статью до конца, то там было указано, что избежать макроподстановок не всегда возможно. Точнее, избежать можно, но это будет более сложное и громоздкое решение. Формирование команд Select-SQL "на лету" как раз из тех случаев, где без макроподстановки - трудно.

Однако возникает другой вопрос: а действительно ли необходимо формировать команду Select-SQL "на лету"? В момент исполнения кода? Или же это наивное желание новичков написать один "универсальный" код "на все случаи жизни"?

Pulsar_pВ документации по Фоксу я читал, что МП работают медленнее, чем обычный код, но это (если я правильно понял) при выполнении МП в цикле.
Циклы есть явные (for..endfor) и не явные (многократное исполнение метода через разные ссылки). Если явные циклы видны в коде и понятно что является "тормозом" (или это легко определить), то для неявных циклов и повторов все значительно сложнее. На то они и не явные. Поэтому код надо писать так, как-будто он всегда выполняется в цикле.

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

Pulsar_pЕсть ли реальные причины избегать МП?
Есть. Об этом и написана статья.

Проблема только в том, что эти причины невозможно сформулировать в паре фраз. Основные проблемы, которые порождает макроподстановка, возникают не столько при написании, сколько при сопровождении и модификации кода. А понимание этого приходит только с опытом. Когда сам же начинаешь натыкаться на макроподстановки и вспоминать автора кода всякими словами

Как следствие, убедить новичка не использовать макроподстановку - невозможно! Ну, нет убедительных аргументов на этапе написания кода. А опыта сопровождения у новичка еще нет и не факт, что появится...

PS: Если хочется обсудить макроподстановку, то заведите отдельную тему. Не стоит вести две паралельные дискуссии, слабо связянные между собой в одной теме.
...
Рейтинг: 0 / 0
Курсор
    #38035328
Pulsar_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ, наверное вы правы. Единственное, что замечу: я не новичок. На каждый фрагмент кода программы (в т.ч. МП) оставляю подробный комментарий. Вряд ли мой преемник будет материть меня...
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Курсор
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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