Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Генератор скрипта на создание таблицы  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
Из правил форума на SQL.RU:
При написании сообщений с просьбой о составлении запроса - хорошим тоном считается предоставление скрипта на создание таблицы и заполнение ее текстовыми данными, а также ожидаемого результата выборки, если это не очевидно из вопроса.
Предлагаю сл. генератор скрипта на создание таблицы:

LOCAL KPL,TEKST,NK,NT,WT,NAMT,I,NPL
NAMT=ALIAS()
kpl=AFIELDS(SU)
x=FCREATE("SKRIPT.PRG")
	TEKST="*СОЗДАНИЕ КУРСОРА ИЗ "+NAMT
	=FPUTS(X,TEKST)
	=FPUTS(X," ")

=FPUTS(X,"SELE 0")
TEKST="CREATE CURSOR C"+NAMT+" ("
FOR I=1 TO M.kpl
	TEKST=TEKST+SU(I,1)+" "+SU(I,2)+"("+LTRIM(STR(SU(I,3),3))+IIF(SU(I,4)=0,"",","+LTRIM(STR(SU(I,4),3)))+")"+IIF(I=M.kpl,")",",")
ENDFOR
=FPUTS(X,TEKST)

SCAN 
	TEKST ="INSERT INTO C"+NAMT+" ("
	FOR I=1 TO M.kpl
		TEKST=TEKST+SU(I,1)+IIF(I=M.kpl,")",",")
	ENDFOR
	TEKST=TEKST+" VALUES ("
	FOR I=1 TO M.kpl
		tip=SU(I,2)	
		NPL=SU(I,1)
		ZN=&NPL
		DL=SU(I,3)
		KD=SU(I,4)
		KD=IIF(TYPE("KD")="C",0,KD)
		do case
			case tip="C"
				 TEKST=TEKST+"'"+ZN++"'"
 			case tip="D"
 				 TEKST=TEKST+"CTOD('"+DTOC(ZN)+"')"
			case tip="L"
				 TEKST=TEKST+IIF(ZN,".T.",".F.")
			case tip="N"
				 TEKST=TEKST+LTRIM(STR(ZN,DL,KD))
			case tip="I"
				 TEKST=TEKST+LTRIM(STR(ZN))
		endcase
		TEKST=TEKST+IIF(I=M.kpl,")",",")
	ENDFOR
	=FPUTS(X,TEKST)
ENDSCAN
=FCLOSE(x)
MODI COMM SKRIPT.PRG
DELETE FILE SKRIPT.PRG

Для создания скрипта достаточно открыть таблицу, установив нужный фильтр или создать курсор,выбрать область где находится таблица и запустить на выполнение код генератора. Как видно из кода, генератор может создать скрипты для таблиц у которых поля типа:"C","D","L","N","I"
28 авг 08, 11:08    [6118619]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
ПД
Guest
Чё та я не понял вашего лисапеда..
GENDBC.PRG видели?
29 авг 08, 06:33    [6123031]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658

ql.ru> сообщил/сообщила в новостях следующее: news:6123031@sql.ru...
> Автор: ПД
> Чё та я не понял вашего лисапеда..
> GENDBC.PRG видели?


В сам код не вникал, но после беглого просмотра понятно, что это генератор
ПРОГРАММЫ, которая создаст и НАПОЛНИТ курсор/таблицу. Для чего это может
понадобится? Для того, чтобы задавая вопрос: "Вот у меня есть две таблички,
как бы мне из них ..." можно было паривести код, который создаст эти
таблички, чтобы оформление вопроса соответствовало правилам данного форума.


Posted via ActualForum NNTP Server 1.4

29 авг 08, 07:26    [6123059]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
ПД
Чё та я не понял вашего лисапеда..
GENDBC.PRG видели?


Если на форум надо пример таблицы,курсора то по правилам SQL.RU надо предоставить скрипт
на создание этой таблицы,например следующий скрипт создан автоматич с помощью выше указанного генератора

*СОЗДАНИЕ КУРСОРА ИЗ QUERY
 
SELE 0
CREATE CURSOR CQUERY (TN C(5),FIO C(40),KODOTD N(3),NACO L(1),DR D(8))
INSERT INTO CQUERY (TN,FIO,KODOTD,NACO,DR) VALUES ('1    ','ГОТОВКО РОМУАЛЬД ИОСИФОВИЧ              ',3,.T.,CTOD('24/04/1940'))
INSERT INTO CQUERY (TN,FIO,KODOTD,NACO,DR) VALUES ('2    ','ВЕЛИЧКО ЛЮЦИАН ГРИГОРЬЕВИЧ              ',1,.F.,CTOD('09/02/1947'))
INSERT INTO CQUERY (TN,FIO,KODOTD,NACO,DR) VALUES ('3    ','ЛИСОВСКИЙ СТАНИСЛАВ ИВАНОВИЧ            ',1,.F.,CTOD('24/08/1947'))
INSERT INTO CQUERY (TN,FIO,KODOTD,NACO,DR) VALUES ('4    ','БЫЧЕК ЕВГЕНИЙ НИКОЛАЕВИЧ                ',10,.T.,CTOD('27/09/1941'))
INSERT INTO CQUERY (TN,FIO,KODOTD,NACO,DR) VALUES ('6    ','ПОЗНЯК НИКОЛАЙ ИВАНОВИЧ                 ',23,.F.,CTOD('07/02/1954'))
INSERT INTO CQUERY (TN,FIO,KODOTD,NACO,DR) VALUES ('8    ','АНИСКЕВИЧ ИВАН ИВАНОВИЧ                 ',45,.F.,CTOD('07/03/1950'))
INSERT INTO CQUERY (TN,FIO,KODOTD,NACO,DR) VALUES ('9    ','АРОДЬ ВАЦЛАВ ФРАНЦЕВИЧ                  ',24,.F.,CTOD('16/02/1944'))
INSERT INTO CQUERY (TN,FIO,KODOTD,NACO,DR) VALUES ('10   ','БЕЙ ФРАНЦ БРОНИСЛАВОВИЧ                 ',27,.F.,CTOD('23/02/1942'))
INSERT INTO CQUERY (TN,FIO,KODOTD,NACO,DR) VALUES ('15   ','БОГДАН ЗДИСЛАВ ИВАНОВИЧ                 ',28,.F.,CTOD('17/11/1959'))
INSERT INTO CQUERY (TN,FIO,KODOTD,NACO,DR) VALUES ('13   ','БУДРА ЧЕСЛАВ АЛЬГЕДРАС                  ',26,.F.,CTOD('09/03/1955'))
29 авг 08, 09:27    [6123218]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658

Вот это некрасиво: CTOD('09/03/1955')

Переделай так, чтобы было {^9999-99-99}

ps year(), month(), day()

'{^'+trans(year(ldField))+'-'+trans(month(ldField))+'-'+trans(day(ldField))+'}'


Posted via ActualForum NNTP Server 1.4

29 авг 08, 10:34    [6123552]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
Galyamov Rinat
Вот это некрасиво: CTOD('09/03/1955')
Переделай так, чтобы было {^9999-99-99}
ps year(), month(), day()
'{^'+trans(year(ldField))+'-'+trans(month(ldField))+'-'+trans(day(ldField))+'}'


Согласно этому замечанию код генератора скрипта приобрёл вид:

LOCAL KPL,TEKST,NK,NT,WT,NAMT,I,NPL
NAMT=ALIAS()
kpl=AFIELDS(SU)
x=FCREATE("SKRIPT.PRG")
	TEKST="*СОЗДАНИЕ КУРСОРА ИЗ "+NAMT
	=FPUTS(X,TEKST)
	=FPUTS(X," ")

=FPUTS(X,"SELE 0")
TEKST="CREATE CURSOR C"+NAMT+" ("
FOR I=1 TO M.kpl
	TEKST=TEKST+SU(I,1)+" "+SU(I,2)+"("+LTRIM(STR(SU(I,3),3))+IIF(SU(I,4)=0,"",","+LTRIM(STR(SU(I,4),3)))+")"+IIF(I=M.kpl,")",",")
ENDFOR
=FPUTS(X,TEKST)

SCAN 
	TEKST ="INSERT INTO C"+NAMT+" ("
	FOR I=1 TO M.kpl
		TEKST=TEKST+SU(I,1)+IIF(I=M.kpl,")",",")
	ENDFOR
	TEKST=TEKST+" VALUES ("
	FOR I=1 TO M.kpl
		tip=SU(I,2)	
		NPL=SU(I,1)
		ZN=&NPL
		DL=SU(I,3)
		KD=SU(I,4)
		KD=IIF(TYPE("KD")="C",0,KD)
		do case
			case tip="C"
				 TEKST=TEKST+"'"+ZN++"'"
 			case tip="D"
 				 TEKST=TEKST+'{^'+trans(year(ZN))+'-'+trans(month(ZN))+'-'+trans(day(ZN))+'}'  &&"CTOD('"+DTOC(ZN)+"')"
			case tip="L"
				 TEKST=TEKST+IIF(ZN,".T.",".F.")
			case tip="N"
				 TEKST=TEKST+LTRIM(STR(ZN,DL,KD))
			case tip="I"
				 TEKST=TEKST+LTRIM(STR(ZN))
		endcase
		TEKST=TEKST+IIF(I=M.kpl,")",",")
	ENDFOR
	=FPUTS(X,TEKST)
ENDSCAN
=FCLOSE(x)
MODI COMM SKRIPT.PRG
DELETE FILE SKRIPT.PRG

После этих изменений получается такой скрипт:

*СОЗДАНИЕ КУРСОРА ИЗ QUERY
 
SELE 0
CREATE CURSOR CQUERY (TN C(5),FIO C(40),NACO L(1),DR D(8))
INSERT INTO CQUERY (TN,FIO,NACO,DR) VALUES ('905  ','ПЕТРАСИК ЛЮЦИАН КАЗИМИРОВИЧ             ',.F.,{^1954-1-8})
29 авг 08, 10:54    [6123647]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658

Ну и datatime по тому же принципу :)


Posted via ActualForum NNTP Server 1.4

29 авг 08, 11:00    [6123694]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
[quot Galyamov Rinat]
Ну и datatime по тому же принципу :)
Тогда ,код генератора примет вид:

LOCAL KPL,TEKST,NK,NT,WT,NAMT,I,NPL
NAMT=ALIAS()
kpl=AFIELDS(SU)
x=FCREATE("SKRIPT.PRG")
	TEKST="*СОЗДАНИЕ КУРСОРА ИЗ "+NAMT
	=FPUTS(X,TEKST)
	=FPUTS(X," ")

=FPUTS(X,"SELE 0")
TEKST="CREATE CURSOR C"+NAMT+" ("
FOR I=1 TO M.kpl
	TEKST=TEKST+SU(I,1)+" "+SU(I,2)+"("+LTRIM(STR(SU(I,3),3))+IIF(SU(I,4)=0,"",","+LTRIM(STR(SU(I,4),3)))+")"+IIF(I=M.kpl,")",",")
ENDFOR
=FPUTS(X,TEKST)

SCAN 
	TEKST ="INSERT INTO C"+NAMT+" ("
	FOR I=1 TO M.kpl
		TEKST=TEKST+SU(I,1)+IIF(I=M.kpl,")",",")
	ENDFOR
	TEKST=TEKST+" VALUES ("
	FOR I=1 TO M.kpl
		tip=SU(I,2)	
		NPL=SU(I,1)
		ZN=&NPL
		DL=SU(I,3)
		KD=SU(I,4)
		KD=IIF(TYPE("KD")="C",0,KD)
		do case
			case tip="C"
				 TEKST=TEKST+"'"+ZN++"'"
 			case tip="D"
 				 TEKST=TEKST+'{^'+trans(year(ZN))+'-'+trans(month(ZN))+'-'+trans(day(ZN))+'}'  &&"CTOD('"+DTOC(ZN)+"')"
			case tip="L"
				 TEKST=TEKST+IIF(ZN,".T.",".F.")
			case tip="N"
				 TEKST=TEKST+LTRIM(STR(ZN,DL,KD))
			case tip="I"
				 TEKST=TEKST+LTRIM(STR(ZN))
			case tip="T"
				 TEKST=TEKST+ ;
				 '{^'+trans(year(ZN))+'-'+trans(month(ZN))+'-'+trans(day(ZN))+' '+trans(hour(ZN))+':'+trans(minute(ZN))+':'+trans(sec(ZN))+'}'
		endcase
		TEKST=TEKST+IIF(I=M.kpl,")",",")
	ENDFOR
	=FPUTS(X,TEKST)
ENDSCAN
=FCLOSE(x)
MODI COMM SKRIPT.PRG
DELETE FILE SKRIPT.PRG

И если есть поле типа DATATIME,то порождается например такой скрипт:

*СОЗДАНИЕ КУРСОРА ИЗ QUERY
 
SELE 0
CREATE CURSOR CQUERY (NZ N(2),WRNAC T(8))
INSERT INTO CQUERY (NZ,WRNAC) VALUES (22,{^2008-8-29 1:35:17})
29 авг 08, 11:45    [6124036]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
Sergey Sizov.
Guest
Ну, раз пошла такая пьянка, то вот что еще можно сделать:
LUCIAN

ZN=&NPL

замени на
ZN=Evaluate(NPL)
а во все trans(month(ZN)), кроме года, добавь второй параметр
trans(month(ZN), '@L 99')
Для времени лучше использовать ttoc(,2)
29 авг 08, 11:57    [6124125]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
Sergey Sizov.
Ну, раз пошла такая пьянка, то вот что еще можно сделать:

Спасибо, я учту твои замечания может ещё поступят предложения...
29 авг 08, 12:10    [6124240]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
Sergey Sizov.
Guest
LUCIAN
Sergey Sizov.
Ну, раз пошла такая пьянка, то вот что еще можно сделать:

Спасибо, я учту твои замечания может ещё поступят предложения...

Их есть у меня! Убери всефункции низкоуровнего доступа к файлам и собирать все в переменную и одним махом через strtofile() выкинуть ее в файл.
29 авг 08, 12:14    [6124269]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
12345зайчик
Guest
+ объяви по-человечьи переменные
29 авг 08, 12:26    [6124372]     Ответить | Цитировать Сообщить модератору
 Re: Генератор скрипта на создание таблицы  [new]
Sergey Sizov.
Guest
12345зайчик
+ объяви по-человечьи переменные

Алексанр, боюсь что это невыполнимое пжелание. :) Это давняя привычка еще со времен ЕС, СМ и т.п.
29 авг 08, 12:36    [6124457]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить