|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Всем доброго. Мне удобно было бы выполнить десяток update запросов, в которые я подставляю одинаковые данные в качестве критерия поиска: Код: sql 1. 2. 3. 4. 5.
Где под a подразумевается некий массив. Т. е ху избежать вот такой писанины: Код: sql 1. 2. 3. 4.
Поскольку в списке критерия поиска будет много значений, хотелось бы их ввести один раз в программе. Каким образом в Фокспро можно описывать такие массивы и подставлять в качестве аргумента командам? Если возможно покажите пример или ссылку на чтиво. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 14:32 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Если "по правильному", то создается временная таблица, содержащая нужные значения и затем используется в опции IN. Это будет примерно так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Хотя в FoxPro возможны и различные "обходные" маневры. Я так думаю, другие посетители форума не удержаться и накидают этих самых "обходных" способов. Но, я бы не советовал их использовать. Опыт, конечно, приобретешь, но нигде, кроме как в FoxPro он не пригодится. А описанный выше способ применим практически во всех языках программирования так или иначе использующий диалект Select-SQL. Ну и в СУБД это будет работать, если там есть понятие временной таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 17:14 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
ВладимирМЯ так думаю, другие посетители форума не удержаться и накидают этих самых "обходных" способов. Но, я бы не советовал их использовать. Нехороший совет. Не знаешь что напишут, но уже советуешь не читать. Напишут глупостей - тогда и покритикуешь. В фоксе конструкция "WHERE другоеполе in (...)" не оптимизирована, происходит перебор всех записей таблицы, не используется индекс по "другоеполе", если такой индекс есть то может так оказаться что выполнить отдельный UPDATE для каждого значения гораздо быстрее чем обновить разом. Надо замерять скорость на конкретных данных, попробуй так: * Создается временная таблица. В терминах FoxPro - курсор Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
при таком подходе курсор не обязательно делать, можно массив так же перебрать по одному элементу. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 17:32 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Dima TВ фоксе конструкция "WHERE другоеполе in (...)" не оптимизирована, происходит перебор всех записей таблицы, не используется индекс по "другоеполе"[/src] при таком подходе курсор не обязательно делать, можно массив так же перебрать по одному элементу. А проверить Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 17:51 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
ВладимирМЕсли "по правильному", то создается временная таблица Спасибо конечно, но эта задача разовая. Я сначала так и думал, но оказалось проще просто запросами в Command рулить. а так как в Коммандах можно только одну строку выполнить, я подумал что мне проще будет минипрогу написать, тем паче что в случае с фоксом это легко и просто. авторНадо замерять скорость на конкретных данных Не надо. В моем случае. Чего там - десяток несчастных таблиц по 1000 записей. Короче скорость у меня вполне приемлема получается. Повторюсь - задача разовая, меня устроит и выполнение запросов в Command, так что над оптимизацией заморачиваться нет желания. Хотелось бы чтоб лисичка меня понимала, но похоже я требую от нее больше чем можно. Хотя думаю ей бы не помешала возможность таким образом определять списки в программах - в одну строку константно ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 17:51 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 18:20 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Виталий БеликВладимирМЕсли "по правильному", то создается временная таблица Спасибо конечно, но эта задача разовая. Я сначала так и думал, но оказалось проще просто запросами в Command рулить. а так как в Коммандах можно только одну строку выполнить, я подумал что мне проще будет минипрогу написать, тем паче что в случае с фоксом это легко и просто. Начиная с VFP6 в окне Command можно выполнить несколько команд сразу. Надо просто предварительно выделить тот блок, который собираешься выполнить и нажать Enter. Будет выполнен весь выделенный кусок как одна процедура. Кстати, непонятно, какое отношение к этому имеют временные таблицы. Ведь именно их можно создавать и наполнять по одной команде за раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 18:57 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Dima TВладимирМЯ так думаю, другие посетители форума не удержаться и накидают этих самых "обходных" способов. Но, я бы не советовал их использовать. Нехороший совет. Не знаешь что напишут, но уже советуешь не читать. Напишут глупостей - тогда и покритикуешь. Судя по написанному тобой - очень хороший и своевременный Посмотри на профиль автора темы. Для него FoxPro - просто один из многих языков. Какой смысл объяснять ему нечто, специфическое только и исключительно для этого самого языка. Особенно в свете работы с СУБД совершенно бессмысленно объяснять правила работы с навигационными командами (SCAN). А уж всякие "заморочки" с оптимизацией, индексами и т.д., и т.п. - вообще почти пустой звук. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 19:04 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Виталий БеликХотя думаю ей бы не помешала возможность таким образом определять списки в программах - в одну строку константно Да можно это сделать. Поиск по ключевому слову "макроподстановка". Просто, во-первых, это специфический прием, основанный на том, что FoxPro - это интерпретатор, а не компилятор, а, во-вторых, новичкам пользоваться этим инструментом крайне не желательно. "Эта штука посильнее Фауста Гете" (с). В том смысле, что новички на нее сразу "подсаживаются", а потом начинается дикая "ломка". Аналогия более чем уместна. Очень сильный инструмент которым надо уметь пользоваться. Точнее, уметь НЕ пользоваться (почему - предмет отдельного разговора) Можно и через массивы. Но опять же, это специфика именно FoxPro. Есть такая функция ASCAN(), которую можно использовать в условиях выборки SQL-запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 19:16 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
авторНадо просто предварительно выделить тот блок, который собираешься выполнить и нажать Enter. Будет выполнен весь выделенный кусок как одна процедура. Только видимо сначала придется отучиться нажимать Энтер после каждой введенной строки. авторКстати, непонятно, какое отношение к этому имеют временные таблицы. Ведь именно их можно создавать и наполнять по одной команде за раз. Это к чему была реплика? авторКакой смысл объяснять ему нечто, специфическое только и исключительно для этого самого языка. Думаешь не пойму? авторновичкам пользоваться этим инструментом крайне не желательно. Ты же даже не знаешь что мне о Фоксе известно, как же ты можешь судить обо мне? про Амперсанд-команды я знаю, и иногда использую. В данном случае вопрос скорее о том как объявить массив констант в одну строку (вроде как в Си: int a[]={1,2,3,4,5}), а не как его потом в запросах использовать. Т.е. если мне как разработчику хочется такого удобства - получу ли я его. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 19:46 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Dima TPaulWistА проверить А подумать? Один уже так проверял, почитай чего напроверял . И где репо-код update-а, который необходим ТС ??? в виде: Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2012, 21:03 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
ВладимирМDima Tпропущено... Нехороший совет. Не знаешь что напишут, но уже советуешь не читать. Напишут глупостей - тогда и покритикуешь. Судя по написанному тобой - очень хороший и своевременный Посмотри на профиль автора темы. Для него FoxPro - просто один из многих языков. Какой смысл объяснять ему нечто, специфическое только и исключительно для этого самого языка. Особенно в свете работы с СУБД совершенно бессмысленно объяснять правила работы с навигационными командами (SCAN). А уж всякие "заморочки" с оптимизацией, индексами и т.д., и т.п. - вообще почти пустой звук. Это форум по фоксу вообще-то, поэтому не вижу смысла умалчивать наиболее эффективные по производительности решения. Оставь выбор автору вопроса, испугается сканов - не будет использовать. Может наоборот ему понравится? Пусть сам решает. Я подумал ты на макроподстановку намекал, так сам ее и посоветовал в итоге: ВладимирМДа можно это сделать. Поиск по ключевому слову "макроподстановка". Согласен что макроподстановки часто бездумно используют, но тут как раз тот самый случай когда она дает эффект, поэтому вопрос спорный о ее применении в данной конструкции. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2012, 07:18 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Виталий Беликпро Амперсанд-команды я знаю, и иногда использую. В данном случае вопрос скорее о том как объявить массив констант в одну строку (вроде как в Си: int a[]={1,2,3,4,5}), а не как его потом в запросах использовать. Если знаешь, то тут чего тогда не догадался? Код: sql 1. 2.
"a" это не массив, а строка в данном случае. Только у данной конструкции есть ограничение на длину строки. Точно не помню сколько символов, но не много. Что касается объявления массива в одну строку - нет такого в фоксе, массивы тут редко используются, восновном курсоры. Наполнение курсора INSERT`ами по одному на строку, или (если разово руками) написать brow и Ctrl+Y для добавления строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2012, 07:23 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Виталий Белик, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2012, 10:37 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Dima T"a" это не массив, а строка в данном случае. А-а-а. Вот что я упустил... Я пытался в А пихнуть массив, а надо было строку. Вот за этот пинок спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2012, 13:28 |
|
Один массив в нескольких запросах
|
|||
---|---|---|---|
#18+
Виталий Беликавторновичкам пользоваться этим инструментом крайне не желательно. Ты же даже не знаешь что мне о Фоксе известно, как же ты можешь судить обо мне? Могу оценить уровень знаний по профилю участника форума (где чаще всего задаются вопросы), по используемой терминологии и собственно по стилю вопросов. Делаю однозначный вывод, что для Вас FoxPro "не родной" язык программирования. Использовать - используете, но на уровне "читаю со словарем". Не "чувствуете" этот язык программирования. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2012, 18:44 |
|
|
start [/forum/topic.php?fid=41&msg=37754619&tid=1583724]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 139ms |
0 / 0 |