|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
Добрый день! Нужна помощь! такая проблема. допустим имеется таблица tabl.dbf, в одном из полей через запятую указываются названия полей, в которых происходили изменения записей. например, "поле22, поле55, поле66". при этом, на одна и та же запись может быть изменена несколько раз, все это записывается в таблицу. в итоге на одну и ту же запись приходится несколько записей с измененными полями. вот к примеру три раза изменяли запись. нужно сделать запрос, чтобы в результате сформировалась одна строка с записью, при этом данные для этой записи в данном случае: для поля 22 - берутся из третьей записи(последнее изменение), для полей 33 и 55 - из второй, для поля 44 - из первой. TabS_izmen поле11 поле22 поле33 поле44 поле5522 ; 33 ; 44 а1 а2 а3 а4 а533 ; 55 б1 б2 б3 б4 б522 в1 в2 в3 в4 в5 и в результате должно получиться: поле11 поле22 поле33 поле44 поле55а1 в2 б3 а44 б55 это реально сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 09:31 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
fox123, А что в этой таблице в носится в те поля, которые не менялись? Нельзя ли просто из нее взять последнюю запись? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 10:09 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
fox123, Правильней было бы изменить логику и меньше было бы проблем. Например, таким образом: fields value поле22 а2 поле33 а3 поле44 а4 поле33 б3 поле55 б5 поле22 в2 И поле добавить с датой изменений. Тогда и запросом легко получили бы результат изменение по более поздней дате. А так только с применением функции, которая будет разбирать данные в поле, указанные через точку с запятой. Кстати, в вашем результате ошибка: поле11 не изменялось. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 10:10 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
да, вы правы, понятнее вот так таблицу переписать: TabS_izmen поле11 поле22 поле33 поле44 поле5522 ; 33 ; 44 * а2 а3 а4 *33 ; 55 * * б3 * б522 * в2 * * * где значения * - это значения из исходной базы данных, т.е. они не изменялись, причем в каждом поле они одинаковы, значит не имеет значения из какой записи их брать, важно чтобы результат был такой: поле11 поле22 поле33 поле44 поле55* в2 б3 а4 б5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 10:37 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
Banditosfox123, А что в этой таблице в носится в те поля, которые не менялись? Нельзя ли просто из нее взять последнюю запись? если я возьму из нее последнюю запись то изменится (в данном случае) только одно поле, а нужно 4 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 10:38 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
IgorNGfox123, Правильней было бы изменить логику и меньше было бы проблем. Например, таким образом: fields value поле22 а2 поле33 а3 поле44 а4 поле33 б3 поле55 б5 поле22 в2 И поле добавить с датой изменений. Тогда и запросом легко получили бы результат изменение по более поздней дате. А так только с применением функции, которая будет разбирать данные в поле, указанные через точку с запятой. Кстати, в вашем результате ошибка: поле11 не изменялось. не совсем понятно, что вы имеете ввиду. нет возможности изменять что-то в программе, у меня только итоговая таблица из которой нужно сделать выборку. думаю функция, которая будет разбирать данные в поле, указанные через точку с запятой - это то, что нужно:) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 10:45 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
fox123если я возьму из нее последнюю запись то изменится (в данном случае) только одно поле, а нужно 4 Не так. Ты вносишь в таблицу ВСЮ запись, включая поля которые менялись и которые не менялись. Т.е. у тебя последняя запись - всегда содержит верные данные. Совсем, как в твоей последней таблице, только вместо звездочек - реальные значения, которые не менялись. Кста, ты уверен, что у тебя случайно не так работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 10:52 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
Кстати, ты так и не ответил на вопрос: А что в этой таблице в носится в те поля, которые не менялись? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 10:54 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
Banditosfox123если я возьму из нее последнюю запись то изменится (в данном случае) только одно поле, а нужно 4 Не так. Ты вносишь в таблицу ВСЮ запись, включая поля которые менялись и которые не менялись. Т.е. у тебя последняя запись - всегда содержит верные данные. Совсем, как в твоей последней таблице, только вместо звездочек - реальные значения, которые не менялись. Кста, ты уверен, что у тебя случайно не так работает? я ничего не вношу. в таблице и так есть все записи, включая поля которые менялись и которые не менялись. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 11:01 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
BanditosКстати, ты так и не ответил на вопрос: А что в этой таблице в носится в те поля, которые не менялись? ответил. есть исходная БД. пользователь создает новые записи, на основе тех, которые уже имеются в бд. т.е. все поля берутся из этой базы, и те данные, которые меняются, соответственно редактируются и сохраняются в другую таблицу. ко мне попадает уже только эта таблица с измененными данными. все бы ничего, только зачастую пользователь делает ошибки и несколько раз изменяет данные, и на одну запись получается несколько изменений. должно остаться одно - итоговое. так понятнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 11:07 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
fox123так понятнее? Нет. Даже еще больше путаницы. Ты говоришь: fox123в таблице и так есть все записи, включая поля которые менялись и которые не менялись. Тогда в чем вопрос-то? Чутка изменю твою таблицу в начале. Начальное состояние: TabS_izmen поле11поле22поле33поле44поле55 а1 б1 в1 г1 д1 Поехали изменения: TabS_izmen поле11поле22поле33поле44поле5522;33;44 а1 б2 в2 г2 д133;55 а1 б2 в3 г2 д222 а1 б3 в3 г2 д2 В итоге получаем в последней строке нашу нужную строчку со всеми изменениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 14:19 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
Banditosfox123так понятнее? Нет. Даже еще больше путаницы. В итоге получаем в последней строке нашу нужную строчку со всеми изменениями. такой умный BanditosТогда в чем вопрос-то? может ты сначала прочитаешь внимательно вопрос, понятнее некуда объяснено. если не знаешь как сделать, тогда совсем не пиши, чем задавать однотипные вопросы, совершенно не пытаясь вникнуть в суть вопрос в том, чтобы сформировать запись включающую поля из разных записей! потому что последняя запись не есть то, что нужно! поля из последней записи не отображают изменения предшествующих записей, а выводят значения из БД. что непонятного?? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 16:04 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
IgorNGfox123, А так только с применением функции, которая будет разбирать данные в поле, указанные через точку с запятой. пожалуйста код!) или ткни носом в какую-нибудь нужную ссылку ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 16:06 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
fox123, Ткнуть некуда - с таким никогда не встречался. Кода готового нет - надо подумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 16:30 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
fox123такой умный Хм, даже так... Ну, звиняй, что хотел помочь. Ковыряйся сам. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 16:33 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
IgorNG, Ну вот как-то так в данном случае CREATE CURSOR table1 (tabS_izmen C(20), fields11 C(5), fields22 C(5), fields33 C(5), fields44 C(5), fields55 C(5)) INSERT INTO table1 values ("22 ; 33 ; 44", "*", "a2", "a3", "a4", "*") INSERT INTO table1 values ("33 ; 55", "*", "*", "á3", "*", "á5") INSERT INTO table1 values ("22", "*", "â2", "*", "*", "*") CREATE CURSOR Rezult (fields11 C(5), fields22 C(5), fields33 C(5), fields44 C(5), fields55 C(5)) INSERT INTO Rezult VALUES ("", "", "", "", "") SELECT table1 SELECT table1 SCAN a = fields11 b = fields22 c = fields33 d = fields44 e = fields55 IF RECNO() = 1 SELECT Rezult REPLACE fields11 WITH a, fields22 WITH b, fields33 WITH c, fields44 WITH d, fields55 WITH e ELSE SELECT Rezult REPLACE fields11 WITH IIF(ALLTRIM(a) = "*", fields11, a) REPLACE fields22 WITH IIF(ALLTRIM(b) = "*", fields22, b) REPLACE fields33 WITH IIF(ALLTRIM(c) = "*", fields33, c) REPLACE fields44 WITH IIF(ALLTRIM(d) = "*", fields44, d) REPLACE fields55 WITH IIF(ALLTRIM(e) = "*", fields55, e) ENDIF SELECT table1 ENDSCAN SELECT Rezult BROWSE LAST Т.е. первое поле вообще не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2011, 17:00 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
IgorNGIgorNG, Ну вот как-то так в данном случае CREATE CURSOR table1 (tabS_izmen C(20), fields11 C(5), fields22 C(5), fields33 C(5), fields44 C(5), fields55 C(5)) INSERT INTO table1 values ("22 ; 33 ; 44", "*", "a2", "a3", "a4", "*") INSERT INTO table1 values ("33 ; 55", "*", "*", "á3", "*", "á5") INSERT INTO table1 values ("22", "*", "â2", "*", "*", "*") CREATE CURSOR Rezult (fields11 C(5), fields22 C(5), fields33 C(5), fields44 C(5), fields55 C(5)) INSERT INTO Rezult VALUES ("", "", "", "", "") SELECT table1 SELECT table1 SCAN a = fields11 b = fields22 c = fields33 d = fields44 e = fields55 IF RECNO() = 1 SELECT Rezult REPLACE fields11 WITH a, fields22 WITH b, fields33 WITH c, fields44 WITH d, fields55 WITH e ELSE SELECT Rezult REPLACE fields11 WITH IIF(ALLTRIM(a) = "*", fields11, a) REPLACE fields22 WITH IIF(ALLTRIM(b) = "*", fields22, b) REPLACE fields33 WITH IIF(ALLTRIM(c) = "*", fields33, c) REPLACE fields44 WITH IIF(ALLTRIM(d) = "*", fields44, d) REPLACE fields55 WITH IIF(ALLTRIM(e) = "*", fields55, e) ENDIF SELECT table1 ENDSCAN SELECT Rezult BROWSE LAST Т.е. первое поле вообще не нужно. говорит "must specify additional parameters" это код для конкретного случая? изменения могут быть любыми, не обязательно что в первой записи изменяются поля 22, 33, 44.. в общем, IgorNG, спасибо, за помощь! но кажетса придется в ручную изменять.. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2011, 02:52 |
|
Как сделать такой запрос??
|
|||
---|---|---|---|
#18+
fox123, CREATE CURSOR table1 (tabS_izmen C(20), fields11 C(5), fields22 C(5), fields33 C(5), fields44 C(5), fields55 C(5)) INSERT INTO table1 values ("22 ; 33 ; 44", "*", "a2", "a3", "a4", "*") INSERT INTO table1 values ("33 ; 55", "*", "*", "a3", "*", "a5") INSERT INTO table1 values ("22", "*", "a2", "*", "*", "*") CREATE CURSOR Rezult (fields11 C(5), fields22 C(5), fields33 C(5), fields44 C(5), fields55 C(5)) INSERT INTO Rezult VALUES ("", "", "", "", "") SELECT table1 SCAN a = fields11 b = fields22 c = fields33 d = fields44 e = fields55 IF RECNO() = 1 SELECT Rezult REPLACE fields11 WITH a, fields22 WITH b, fields33 WITH c, fields44 WITH d, fields55 WITH e ELSE SELECT Rezult REPLACE fields11 WITH IIF(ALLTRIM(a) = "*", fields11, a) REPLACE fields22 WITH IIF(ALLTRIM(b) = "*", fields22, b) REPLACE fields33 WITH IIF(ALLTRIM(c) = "*", fields33, c) REPLACE fields44 WITH IIF(ALLTRIM(d) = "*", fields44, d) REPLACE fields55 WITH IIF(ALLTRIM(e) = "*", fields55, e) ENDIF SELECT table1 ENDSCAN SELECT Rezult BROWSE LAST Проверил еще раз. Все работает. Будет работать только в том случае, если вместо неизменяемых значений будут стоять звездочки, неважно менялись ли данные в первой записи или нет. А алгоритм следующий: во временной таблице всего одна строка. В ней запоминаются значения всех полей первой записи исходной таблицы. Берется вторая запись исходной таблицы и происходит сравнение, т.е. если значение менялось, то оно заносится в результирующую таблицу, а если не менялось, остается прежнее. И в итоге получается одна запись со всеми измененными значениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2011, 08:35 |
|
|
start [/forum/topic.php?fid=41&msg=37223007&tid=1584419]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 140ms |
0 / 0 |