|
Курсор
|
|||
---|---|---|---|
#18+
Нужна помощь плиз!!! Есть две переменные, одна хранит название таблицы вторая хранит название одного поля из таблицы. В обычном случае мы вытаскиваем значение следующим образом: Table1.Field1. Возможно ли вытащить значение из этой таблицы и этого поля обратившись через эти две переменные? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 14:10 |
|
Курсор
|
|||
---|---|---|---|
#18+
Код: sql 1. 2.
Если не опасаетесь использовать макроподстановку Код: sql 1.
Более правильно Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 14:24 |
|
Курсор
|
|||
---|---|---|---|
#18+
Иухенио, +1 или так: Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 14:30 |
|
Курсор
|
|||
---|---|---|---|
#18+
AndreTM[src]Если не опасаетесь использовать макроподстановкуА почему ее надо опасаться? Еще не помню случая, чтобы мп глючила. Другой вопрос, всегда ли оправдано ее использование... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 14:41 |
|
Курсор
|
|||
---|---|---|---|
#18+
Jonny540Еще не помню случая, чтобы мп глючила"Бездумный копипаст приводит к задумчивости" (Ц) Это как раз с МП в Фоксе очень хорошо соотносится... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 14:49 |
|
Курсор
|
|||
---|---|---|---|
#18+
Все заработало! Спасибо большое! Очень помогло! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 14:53 |
|
Курсор
|
|||
---|---|---|---|
#18+
По возможности, следует избегать написание кода, в котором имена полей и таблиц хранятся в переменных. Не стоит стремиться писать универсальный код "на все случаи жизни". В большинстве случаев, в этом нет необходимости. Кроме того, есть различные способы "макроподстановок". В зависимсоти от конкретной задачи. Подробнее можно почитать здесь Макроподстановка ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 14:56 |
|
Курсор
|
|||
---|---|---|---|
#18+
ВладимирМ, Целиком и полностью с тобой согласен, но в моем случае название таблицы и полей меняются динамически. Если в двух словах пишу конвертер из DBF в MYSQL, соответственно таблицы все выбираются в процессе выполнения программы, названия полей у всех разные, поэтому и пришлось использовать переменные. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 15:08 |
|
Курсор
|
|||
---|---|---|---|
#18+
Как это "названия таблиц и полей меняются динамически"? В процессе? Не проще ли структуры отбирать опять же в таблицы/курсоры... на крайний случай - есть же afields() и т.п. И вообще, если вы, например, используете OLEDB/ODBC для связки, то зачем вам вычисления полей? - вы же таблицы можете просто переливать as is ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 15:33 |
|
Курсор
|
|||
---|---|---|---|
#18+
ДА у меня БД лежит на MySQL, приложение пишу на FOX PRO, связь через ODBC. Алгоритм следующий: Выбирается таблица DBF (GetFILE()), затем считываю ее структуру в курсор1, затем выбираю БД и таблицу на MySQL (два ComboBox'а). После чего в Grid'е настраиваю соответствие полей. Т.е. в гриде 5 колонок, первая CheckBox'ы, вторая и третья обычные Text, четвертая Combobox, пятая обычный Text. В первой колонке с помощью checkbox'ов отмечаю какие поля будут участвовать в обмене, во второй и третьей название поля и тип поля SQL таблицы, в четвертой колонке находятся ComboBox'ы, с помощью них выбираю какое поле DBF таблицы будет записано в данное поле SQL таблицы, ну и при выборе значения в CMB, в последней колонке появляется тип выбранного поля. После того как установлено соответствие полей двух таблиц, результат сохраняю в курсоре. И уже организовываю цикл, в котором формируется запрос на запись данных в SQL таблицу. В этом же цикле, как раз и участвуют эти переменные, хранящие название таблицы и поля таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 16:21 |
|
Курсор
|
|||
---|---|---|---|
#18+
Все равно нет смысла. Ведь для того, чтобы передать данные на сервер надо будет сформировать команду для вставки в функцию SQLExec(). Но физически, такая команда - это символьная строка. Ну, условно говоря, Вам надо сформировать строку вида Код: sql 1. 2. 3.
Т.е. здесь просто нет места для макроподстановки. Вы формируете символьную строку. "Вытаскивать" имена полей из метаданных нет необходимости. Это сделает сам FoxPro по символу вопросительного знака Ну, чтобы было понятно. Предположим, у Вас есть такие метаданные Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Получать конкретные значения из полей, описанных в метаданных через макроподстановку просто нет необходимости ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 19:39 |
|
Курсор
|
|||
---|---|---|---|
#18+
ВладимирМ, Я извинюсь заранее, если вдруг что не то ляпну, я Fox Pro не так давно начал изучать. Но в данном примере в строке запроса которая формируется, за пишутся же ведь сами названия полей, а не их значения. Т.е. результат будет таков: lcString = "insert into MyTabSQL (Field1, Field2) VALUES (MyTable.Field1, MyTable.Field2) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 20:45 |
|
Курсор
|
|||
---|---|---|---|
#18+
Иухенио, На самом деле будет: Код: php 1.
Знак вопроса - это указание драйверу ODBC подставить вместо имени поля (переменной, выражения) его значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 22:03 |
|
Курсор
|
|||
---|---|---|---|
#18+
Sea_Cat, А вот про это не знал. Я до этого делал таким образом, что у меня строка с запросом функции SQLEXEC передавалась сразу со значениями. А на скорость выполнения запросов такой способ не повлияет? а то у меня самая большая таблица содержит чуть менее 3,5 млн записей? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 22:39 |
|
Курсор
|
|||
---|---|---|---|
#18+
ВладимирМПо возможности, следует избегать написание кода, в котором имена полей и таблиц хранятся в переменных. Не стоит стремиться писать универсальный код "на все случаи жизни". В большинстве случаев, в этом нет необходимости. Кроме того, есть различные способы "макроподстановок". В зависимсоти от конкретной задачи. Подробнее можно почитать здесь Макроподстановка Раз уж речь зашла о макроподстановках: Владимир, если я правильно понял из этой статьи, макроподстановок следует избегать лишь потому, что в них легко запутаться? Это единственная причина? Вот фрагмент кода моей программы: ******************************************************************** 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 *********************************************************************************************** Это несложный запрос, есть гораздо запутаннее, с бОльшим количеством МП. Можно, конечно, вместо МП вставить обычный код, но мне так реально легче ориентироваться. Почему? Условия отбора меняются, и мне проще менять значения переменных, а сам запрос при этом не трогать. В документации по Фоксу я читал, что МП работают медленнее, чем обычный код, но это (если я правильно понял) при выполнении МП в цикле. Есть ли реальные причины избегать МП? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2012, 22:34 |
|
Курсор
|
|||
---|---|---|---|
#18+
Иухенио, На быстродействие программы это никак не влияет, это не макроподстановка, а обычная передача параметров по значению (а не по ссылке, как это по умолчанию принято в Foxpro). Если SQL запрос выполняется локально - в среде FoxPro, то знак вопроса обычно не используется, так как встроенному интерпретатору запросов доступны все переменные и поля таблиц. Но для удаленного сервера требуется только передача параметров по значению. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2012, 20:00 |
|
Курсор
|
|||
---|---|---|---|
#18+
Pulsar_pРаз уж речь зашла о макроподстановках: Владимир, если я правильно понял из этой статьи, макроподстановок следует избегать лишь потому, что в них легко запутаться? Это единственная причина? Не единственная, но основная. Мало написать код один раз. Надо написать его так, чтобы если Вы вернетесь к нему через месяц..два, то Вам (или другому программисту) не понадобился бы еще один месяц, чтобы понять, а что же здесь написано и как это все можно модифицировать. Макроподстановка - это один из приемов, который сильно усложняет понимание кода. Pulsar_pВот фрагмент кода моей программы: Если Вы дочитали статью до конца, то там было указано, что избежать макроподстановок не всегда возможно. Точнее, избежать можно, но это будет более сложное и громоздкое решение. Формирование команд Select-SQL "на лету" как раз из тех случаев, где без макроподстановки - трудно. Однако возникает другой вопрос: а действительно ли необходимо формировать команду Select-SQL "на лету"? В момент исполнения кода? Или же это наивное желание новичков написать один "универсальный" код "на все случаи жизни"? Pulsar_pВ документации по Фоксу я читал, что МП работают медленнее, чем обычный код, но это (если я правильно понял) при выполнении МП в цикле. Циклы есть явные (for..endfor) и не явные (многократное исполнение метода через разные ссылки). Если явные циклы видны в коде и понятно что является "тормозом" (или это легко определить), то для неявных циклов и повторов все значительно сложнее. На то они и не явные. Поэтому код надо писать так, как-будто он всегда выполняется в цикле. А насчет "медленнее", так это надо смотреть по работающему приложению. В отношении макроподстановки, как правило, разница не настолько заметна, чтобы было о чем говорить. Pulsar_pЕсть ли реальные причины избегать МП? Есть. Об этом и написана статья. Проблема только в том, что эти причины невозможно сформулировать в паре фраз. Основные проблемы, которые порождает макроподстановка, возникают не столько при написании, сколько при сопровождении и модификации кода. А понимание этого приходит только с опытом. Когда сам же начинаешь натыкаться на макроподстановки и вспоминать автора кода всякими словами Как следствие, убедить новичка не использовать макроподстановку - невозможно! Ну, нет убедительных аргументов на этапе написания кода. А опыта сопровождения у новичка еще нет и не факт, что появится... PS: Если хочется обсудить макроподстановку, то заведите отдельную тему. Не стоит вести две паралельные дискуссии, слабо связянные между собой в одной теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2012, 15:59 |
|
|
start [/forum/topic.php?fid=41&fpage=49&tid=1583336]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 285ms |
total: | 427ms |
0 / 0 |