Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как сделать такой запрос?? / 19 сообщений из 19, страница 1 из 1
19.04.2011, 09:31
    #37221880
fox123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
Добрый день! Нужна помощь!
такая проблема. допустим имеется таблица 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
это реально сделать?
...
Рейтинг: 0 / 0
19.04.2011, 10:09
    #37221947
Banditos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
fox123,

А что в этой таблице в носится в те поля, которые не менялись?
Нельзя ли просто из нее взять последнюю запись?
...
Рейтинг: 0 / 0
19.04.2011, 10:10
    #37221951
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
fox123,

Правильней было бы изменить логику и меньше было бы проблем.
Например, таким образом:

fields value

поле22 а2
поле33 а3
поле44 а4
поле33 б3
поле55 б5
поле22 в2

И поле добавить с датой изменений. Тогда и запросом легко получили бы результат изменение по более поздней дате.
А так только с применением функции, которая будет разбирать данные в поле, указанные через точку с запятой.
Кстати, в вашем результате ошибка: поле11 не изменялось.
...
Рейтинг: 0 / 0
19.04.2011, 10:37
    #37222003
fox123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
да, вы правы, понятнее вот так таблицу переписать:
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
...
Рейтинг: 0 / 0
19.04.2011, 10:38
    #37222006
fox123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
Banditosfox123,

А что в этой таблице в носится в те поля, которые не менялись?
Нельзя ли просто из нее взять последнюю запись?
если я возьму из нее последнюю запись то изменится (в данном случае) только одно поле, а нужно 4
...
Рейтинг: 0 / 0
19.04.2011, 10:45
    #37222023
fox123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
IgorNGfox123,

Правильней было бы изменить логику и меньше было бы проблем.
Например, таким образом:

fields value

поле22 а2
поле33 а3
поле44 а4
поле33 б3
поле55 б5
поле22 в2

И поле добавить с датой изменений. Тогда и запросом легко получили бы результат изменение по более поздней дате.
А так только с применением функции, которая будет разбирать данные в поле, указанные через точку с запятой.
Кстати, в вашем результате ошибка: поле11 не изменялось.
не совсем понятно, что вы имеете ввиду.
нет возможности изменять что-то в программе, у меня только итоговая таблица из которой нужно сделать выборку.
думаю функция, которая будет разбирать данные в поле, указанные через точку с запятой - это то, что нужно:)
...
Рейтинг: 0 / 0
19.04.2011, 10:52
    #37222038
Banditos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
fox123если я возьму из нее последнюю запись то изменится (в данном случае) только одно поле, а нужно 4

Не так.
Ты вносишь в таблицу ВСЮ запись, включая поля которые менялись и которые не менялись. Т.е. у тебя последняя запись - всегда содержит верные данные. Совсем, как в твоей последней таблице, только вместо звездочек - реальные значения, которые не менялись.
Кста, ты уверен, что у тебя случайно не так работает?
...
Рейтинг: 0 / 0
19.04.2011, 10:54
    #37222044
Banditos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
Кстати, ты так и не ответил на вопрос:

А что в этой таблице в носится в те поля, которые не менялись?
...
Рейтинг: 0 / 0
19.04.2011, 11:01
    #37222056
fox123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
Banditosfox123если я возьму из нее последнюю запись то изменится (в данном случае) только одно поле, а нужно 4

Не так.
Ты вносишь в таблицу ВСЮ запись, включая поля которые менялись и которые не менялись. Т.е. у тебя последняя запись - всегда содержит верные данные. Совсем, как в твоей последней таблице, только вместо звездочек - реальные значения, которые не менялись.
Кста, ты уверен, что у тебя случайно не так работает?

я ничего не вношу. в таблице и так есть все записи, включая поля которые менялись и которые не менялись.
...
Рейтинг: 0 / 0
19.04.2011, 11:07
    #37222070
fox123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
BanditosКстати, ты так и не ответил на вопрос:

А что в этой таблице в носится в те поля, которые не менялись?


ответил. есть исходная БД. пользователь создает новые записи, на основе тех, которые уже имеются в бд. т.е. все поля берутся из этой базы, и те данные, которые меняются, соответственно редактируются и сохраняются в другую таблицу. ко мне попадает уже только эта таблица с измененными данными. все бы ничего, только зачастую пользователь делает ошибки и несколько раз изменяет данные, и на одну запись получается несколько изменений. должно остаться одно - итоговое. так понятнее?
...
Рейтинг: 0 / 0
19.04.2011, 14:19
    #37222696
Banditos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
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
В итоге получаем в последней строке нашу нужную строчку со всеми изменениями.
...
Рейтинг: 0 / 0
19.04.2011, 16:04
    #37222999
fox123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
Banditosfox123так понятнее?
Нет. Даже еще больше путаницы.

В итоге получаем в последней строке нашу нужную строчку со всеми изменениями.
такой умный

BanditosТогда в чем вопрос-то?
может ты сначала прочитаешь внимательно вопрос, понятнее некуда объяснено. если не знаешь как сделать, тогда совсем не пиши, чем задавать однотипные вопросы, совершенно не пытаясь вникнуть в суть
вопрос в том, чтобы сформировать запись включающую поля из разных записей! потому что последняя запись не есть то, что нужно! поля из последней записи не отображают изменения предшествующих записей, а выводят значения из БД. что непонятного??
...
Рейтинг: 0 / 0
19.04.2011, 16:06
    #37223007
fox123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
IgorNGfox123,

А так только с применением функции, которая будет разбирать данные в поле, указанные через точку с запятой.


пожалуйста код!) или ткни носом в какую-нибудь нужную ссылку
...
Рейтинг: 0 / 0
19.04.2011, 16:30
    #37223073
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
fox123,

Ткнуть некуда - с таким никогда не встречался. Кода готового нет - надо подумать.
...
Рейтинг: 0 / 0
19.04.2011, 16:33
    #37223081
Banditos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
fox123такой умный

Хм, даже так...
Ну, звиняй, что хотел помочь. Ковыряйся сам.
...
Рейтинг: 0 / 0
19.04.2011, 17:00
    #37223156
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
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

Т.е. первое поле вообще не нужно.
...
Рейтинг: 0 / 0
20.04.2011, 02:52
    #37223741
fox123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
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, спасибо, за помощь! но кажетса придется в ручную изменять..
...
Рейтинг: 0 / 0
20.04.2011, 08:35
    #37223827
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
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

Проверил еще раз. Все работает. Будет работать только в том случае, если вместо неизменяемых значений будут стоять звездочки, неважно менялись ли данные в первой записи или нет. А алгоритм следующий: во временной таблице всего одна строка. В ней запоминаются значения всех полей первой записи исходной таблицы. Берется вторая запись исходной таблицы и происходит сравнение, т.е. если значение менялось, то оно заносится в результирующую таблицу, а если не менялось, остается прежнее. И в итоге получается одна запись со всеми измененными значениями.
...
Рейтинг: 0 / 0
21.04.2011, 03:08
    #37225808
fox123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такой запрос??
IgorNG,

Спасибо!
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как сделать такой запрос?? / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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