powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как сделать такой запрос??
19 сообщений из 19, страница 1 из 1
Как сделать такой запрос??
    #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
Как сделать такой запрос??
    #37221947
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fox123,

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

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

fields value

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

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

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

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

fields value

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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


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