Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Ошибка программы / 25 сообщений из 25, страница 1 из 1
18.11.2006, 20:54
    #34138773
mr. Eof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Здравствуйте!

Господа профессионалы, помогите мне пожалуйста!

Ситуация в следующем:
Есть одна форма и две таблицы.
В форме - в Text1 и text2 пользователь вводит значения и нажимает кнопку подтверждения.
Программа ищет в таблице access_table запись с такими значениями. Если такая найдена, то записать ее id в log_table и переходит к другой форме, иначе - выходит.

Структура таблиц:
access_table
|--------------------------------|
| id | Login | Password |
|--------------------------------|

log_table
|----------------------------|
| id | User_id | Time |
|----------------------------|

Я делаю так:
Код: plaintext
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.
CLOSE TABLES all

id =  0 

USE "Tables\access_table.dbf" ALIAS access_table
SELECT access_table

num = RECCOUNT()
FOR i =  1  TO num STEP  1 
	GOTO i
	IF ((access_table.Login = thisform.text1.Value ) AND (access_table.Password = thisform.text2.Value)) THEN
		id = access_table.id   
		EXIT 
	ENDIF
ENDFOR

CLOSE TABLES all

IF id <>  0  THEN
	USE "Tables\log_table.dbf" ALIAS log_table
	SELECT log_table

	INSERT INTO log_table (user_id, time) VALUES (id, date())

	thisForm.Release
	DO FORM 'Forms\MainMenu.scx'
ELSE
	thisForm.Release
	CLOSE ALL
ENDIF

Но! Результат всегда один. Как при правильно введенных значениях так и при не правильных, программа - завершается...

Помогите пожалуйста.
...
Рейтинг: 0 / 0
18.11.2006, 22:49
    #34138835
Guest1000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Можно что-нить типа такого поробывать:

USE log_table IN 0
USE access_table IN 0
SELECT access_table

LOCATE FOR (UPPER(access_table.Login) = UPPER(thisform.text1.Value) ) AND;
(UPPER(access_table.Password) = UPPER (thisform.text2.Value) ))
IF FOUND()
INSERT INTO log_table (user_id, time) VALUES (access_table.id , date())

thisForm.Release
DO FORM 'Forms\MainMenu.scx'
ELSE
thisForm.Release
ENDIF
...
Рейтинг: 0 / 0
18.11.2006, 23:05
    #34138842
MAJIbIIII
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Да нет вся твоя ошибка заключается в одной строке. Смотри как надо (и у тебя все получится):

IF ((access_table.Login = alltrim(thisform.text1.Value) ) AND ;
(access_table.Password = alltrim(thisform.text2.Value))) THEN
id = access_table.id
...
Рейтинг: 0 / 0
18.11.2006, 23:45
    #34138882
MAJIbIIII
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Ссори хотел как лучше, получилось как всегда. Вот так будет лучше:
Да и вообще правильно говорит Guest1000 сделай следующим образом:


CLOSE TABLES all

id = 0

USE Tables\access_table IN 0
USE Tables\log_table.dbf IN 0

SELECT('access_table')

* просто чтоб не возникло путаницы в дальнейшем
num = RECCOUNT('access_table')

* STEP 1 вообще-то идет по умолчанию (смысла нет эту команду оставлять)
FOR i = 1 TO num
GOTO i
IF ((access_table.Login=ALLTRIM(thisform.text1.Value)) AND ;
(access_table.Password=ALLTRIM(thisform.text2.Value))) THEN ;
id = access_table.id
EXIT
ENDIF
ENDFOR

SELECT('log_table')
IF id <> 0 THEN

INSERT INTO log_table (user_id, time) VALUES (id, date())

thisForm.Release
DO FORM 'Forms\MainMenu.scx'
ELSE
thisForm.Release
CLOSE ALL
ENDIF
...
Рейтинг: 0 / 0
18.11.2006, 23:53
    #34138888
mr. Eof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Большое спасибо за советы!
Реализовал как вы говорили.

Последний и предпоследний варианты - работают, но!

В таблицу они пишут не id из первой таблицы, а число 1! По любому, тоесть, должен например записать 1001, а пишет 1. Должен 1003 а пишет 1.

Господа, что это как вы думаете?
...
Рейтинг: 0 / 0
18.11.2006, 23:55
    #34138890
MAJIbIIII
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Пришли исходники (2 таблицы, и 2 формы) скажу точно!
majibiiii@yandex.ru
...
Рейтинг: 0 / 0
18.11.2006, 23:56
    #34138891
mr. Eof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
И еще! он - не проверяет верность!
тоесть он не ищет! я ввел значение, которого не существует в таблице 1 (там где ищем) а в базу всеравно зашел!!!
...
Рейтинг: 0 / 0
19.11.2006, 00:02
    #34138896
mr. Eof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
ок. спасибо. пришлю через 5 минут
...
Рейтинг: 0 / 0
19.11.2006, 00:20
    #34138904
MAJIbIIII
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
mr. Eofок. спасибо. пришлю через 5 минут
Просьба сообщение отослать еще раз (файл оказался испорченным) без инструкций...
...
Рейтинг: 0 / 0
19.11.2006, 00:30
    #34138905
mr. Eof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Вот файл: http://www.webfile.ru/1198321
...
Рейтинг: 0 / 0
19.11.2006, 00:55
    #34138919
MAJIbIIII
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Код: plaintext
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.
CLOSE TABLES all

id_ =  0 

USE 'Tables\access_table' IN  0 
USE 'Tables\log_table.dbf' IN  0 

SELECT('access_table')

num = RECCOUNT('access_table')

FOR i =  1  TO num
	GOTO i
	IF ((access_table.Login+" "=ALLTRIM(thisform.text1.Value)+" ") AND (access_table.Password+" "=ALLTRIM(thisform.text2.Value)+" ")) THEN
		id_ = access_table.id 
      EXIT 
	ENDIF
ENDFOR

SELECT('log_table')
IF id_ <>  0  THEN
	INSERT INTO log_table (user_id, time) VALUES (id_, date())
	thisForm.Release
	DO FORM 'Forms\MainMenu.scx'
ELSE
	thisForm.Release
	CLOSE ALL
ENDIF
Кажется так все работает (ловкость рук и никакого мошеничества). Если что -то не поймешь или еще что-то не получится пиши e-mail ты знаешь.
...
Рейтинг: 0 / 0
19.11.2006, 00:58
    #34138921
mr. Eof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Большое спасибо!

Все - работает!

Честно сказать, круто, хотя зачем нужен пробел " " - я так и не понял..

Но всеравно - спасибо!
...
Рейтинг: 0 / 0
19.11.2006, 01:01
    #34138922
MAJIbIIII
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Отвечаю пробел нужен для того чтобы fox автоматически (при пустом text2 и правильном логине) не подставлял правильное значение в адрес. Короче пользуйся на здоровье!
...
Рейтинг: 0 / 0
19.11.2006, 01:06
    #34138926
ORAselect
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
PUBLIC pass
* Инициализация переменной перед тем, как нажать кнопку, а затем

pass = allt(pass)

select count(*) flag ,p.* from TablePassword p where p.pasword = pass into cursor MyCursor

sele MyCur
if flag #0
insert into LogTable values(MyCur->id,IdUser,sysdate)
messagebox('Вас приветствует программа....!')
else
messagebox('Ошибка идентификации!')
endif

rele pass
...
Рейтинг: 0 / 0
19.11.2006, 01:11
    #34138927
ORAselect
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Поправь имя курсора везде MyCursor. Пользуйся запросами везде, где можно. А можно везде. Не втыкай явные циклы, не используй replace... и не придется пробелы считать, думать как и что сравнивать. Изучи команды SQL - поможет наперед!!!
...
Рейтинг: 0 / 0
19.11.2006, 02:24
    #34138958
mr. Eof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
ORAselectПоправь имя курсора везде MyCursor. Пользуйся запросами везде, где можно. А можно везде. Не втыкай явные циклы, не используй replace... и не придется пробелы считать, думать как и что сравнивать. Изучи команды SQL - поможет наперед!!!

Большое спасибо!
...
Рейтинг: 0 / 0
19.11.2006, 14:32
    #34139178
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
ORAselectПоправь имя курсора везде MyCursor. Пользуйся запросами везде, где можно. А можно везде. Не втыкай явные циклы, не используй replace... и не придется пробелы считать, думать как и что сравнивать. Изучи команды SQL - поможет наперед!!!
Для поиска одной записи использовать Select-SQL? Можно, конечно, но это называется "из пушки по воробьям". "Использовать везде, где можно" - слишком категорично. Получишь массу проблем и тормозов. Как ни странно, но Select-SQL далеко не всегда самый быстрый способ поиска данных.

Вообще-то, самый первый ответ от Guest1000 - самый правильный. Вместо перебора следует использовать команду LOCATE

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CLOSE TABLES all

USE "Tables\access_table.dbf" ALIAS access_table
SELECT access_table

* Для оптимизации команды LOCATE надо отключить главный индекс
SET ORDER TO  0 

* Число  10  в функции PADR() - условно. 
* Надо поставить то значение, которое равно размерности поля, с которым идет сравнение
* Разумеется, если поля Login и Password - это поля типа Character, а не VarChar
LOCATE FOR access_table.Login = PADR(thisform.text1.Value, 10 ) AND ;
			access_table.Password = PADR(thisform.text2.Value, 10 )

IF FOUND("access_table") = .T.
	USE "Tables\log_table.dbf" ALIAS log_table
	SELECT log_table

	INSERT INTO log_table (user_id, time) VALUES (access_table.id, date())
	thisForm.Release
	DO FORM 'Forms\MainMenu.scx'
ELSE
	thisForm.Release
	CLOSE ALL
ENDIF
...
Рейтинг: 0 / 0
19.11.2006, 14:42
    #34139190
ORAselect
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Еше раз об SQL. Еще раз - применяйте везде. Меньше ошибок, Код короче, работает быстрее в разы, отладка минимальна - негде косячить. А "ПУШКА" - это не пушка, а механизм, причем гораздо менее затратный во всех отношениях.

Надо уметь им пользоватться, в т.ч. индексами. По индексированной таблице select работает как seek. Короче, читайте хорошие книги, не живите в прошлом веке - паровоз уже уехал далеко.
...
Рейтинг: 0 / 0
19.11.2006, 15:10
    #34139220
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
ORAselectНадо уметь им пользоватться, в т.ч. индексами.
Золотые слова! Я серьезно.

Только почему Вы применяете их выборочно? Для Select-SQL: "учитесь пользоваться", а для всех остальных команд поиска: "прошлый век", "поезд ушел"?

Если рассматривать команду Select-SQL, то, в общем случае:

1) Сложнее для понимания. Как следствие, кличество ошибок больше . Сложнее в отладке. Накосячить тоже есть где. Не в синтаксисе, а именно в логике.

Например, Вы уже накосячили даже в такой примитивной задаче. Ошибочная логика. Вас подвела именно кажущаяся простота. Как собственно задачи, так и конструкции Select-SQL.

Точнее, не то, чтобы "накосячили", а сделали ряд допущений, при которых такая логика будет работать. Но не спросили автора топика, а действительно ли у него заданы эта граничные условия? В данном случае:

-) SET ANSI (возможен ли поиск по первым символам?)
-) Может ли быть для разных Login один и тот же Password (где проверка Login?)
-) Уже не по Select-SQL: использовать PUBLIC для локальных задач - получить большие проблемы

2) Есть ряд задач, когда Select-SQL работает значительно медленнее навигационных команд

3) Если речь идет о таблицах, объем записей которых невелик (не думаю, что список пользователй так уж огромен), то разница в скорости команд Select-SQL и навигационных команд не ощутима. Как для программы, так и для пользователя


Для справки :

ВСЕ команды FoxPro имеющие опцию FOR также используют Rushmore-оптимизацию. Для полного ее использования рекомендуется перед такими командами отключать главнй индекс (SET ORDER TO 0). В этом случае скорость работы таких команд сопоставима со скоростью SEEK.
...
Рейтинг: 0 / 0
19.11.2006, 22:31
    #34139580
ORAselect
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Володя!

В итоге есть задача, а она на самом деле достаточно тривиальна и проста. Делать туманные представления о возможных проблемах там, где их нет не вижу смысла и опыт (более 20 лет) показал, что именно SQL наиболее полно соответствует именно сложным программам с внушительной логикой.
А переход на работу в СУБД ORACLE и совсем привел к мысли, что там, где есть выбор между SQL и чем угодно еще нужно выбирать SQL.
Собственно, это показала мировая практика и тут Ваше мнение вряд ли что изменит.

Во-вторых. Явно пишет новичек и именно ему, а не Вам я дал вполне ответственный совет.

В третьих. И Вам советую применять SQL везде, где можно. Попрактикуете и наверняка согласитесь. Я тоже лет 10 назад подписался бы под вашим ответом.

С наилучшими, искренне Ваш...
...
Рейтинг: 0 / 0
19.11.2006, 22:43
    #34139592
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
ORAselectВ третьих. И Вам советую применять SQL везде, где можно. Попрактикуете и наверняка согласитесь....
Это очень спорный совет...

Не вдаваясь в подробности хотелось бы зметить для чистоты ответа (поддержав замечание Владимира), что команды SEEK и предикт FOR работают во многих случаях намного быстрее CRUD комманд, но это относится исключительно к FoxPro, так как есть выбор...
...
Рейтинг: 0 / 0
19.11.2006, 23:12
    #34139627
ORAselect
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
Sergey Ch ORAselectВ третьих. И Вам советую применять SQL везде, где можно. Попрактикуете и наверняка согласитесь....
Это очень спорный совет...

Не вдаваясь в подробности хотелось бы зметить для чистоты ответа (поддержав замечание Владимира), что команды SEEK и предикт FOR работают во многих случаях намного быстрее CRUD комманд, но это относится исключительно к FoxPro, так как есть выбор...

Все относительно - разумеется, но есть и вопрос, на который давался ответ. И речь идет о подходе, а не о частностях и подход я считаю верным именно тот, который советую. Быстрее и "с тормозами" очень сильно зависит от частностей. Но и они не отменяют преимуществ SQL. Это вовсе не означает, что надо инициализировать локальную переменную всесто '01' конструкцией с селектом. Однако в теле программы гораздо понятнее именно селекты...

С уважением...
...
Рейтинг: 0 / 0
21.11.2006, 20:13
    #34145094
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
ORAselectОднако в теле программы гораздо понятнее именно селекты...
Применительно к Фоксу...
- Селекты могут быть и гораздо непонятнее, особенно при использовании evaluate() и макроподстановки...
что сплошь и рядом случается при наращивании пользовательского интерфейса запросов.
- Селекты себя оправдывают в логике вычислений и отбора данных, "скрытых" от пользователя.
- Селекты себя мало оправдывают в интерактивном режиме, поскольку проще связать
базу-вью-грид и делать locate по эвенту (извращаюсь я для примера :), чем отбор 1 записи
из базы с 1-5-20 млн. по условию на 5 полей

2ВладимирМ да это я так, давно уже в ветку не заглядывал...
...
Рейтинг: 0 / 0
21.11.2006, 20:44
    #34145129
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
хороший язык фокс (((
только спецов на нем все меньше (((
...
Рейтинг: 0 / 0
21.11.2006, 23:08
    #34145272
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка программы
ORAselect
В итоге есть задача, а она на самом деле достаточно тривиальна и проста. Делать туманные представления о возможных проблемах там, где их нет не вижу смысла и опыт (более 20 лет) показал, что именно SQL наиболее полно соответствует именно сложным программам с внушительной логикой.
В данном случае использование Select-SQL усложняет и затуманивает решение задачи. Зачем мне подсчитывать количество , если надо найти одну единственную запись? Любую.

ORAselectА переход на работу в СУБД ORACLE и совсем привел к мысли, что там, где есть выбор между SQL и чем угодно еще нужно выбирать SQL.
Не совсем так. В данном случае это привело к лености мысли.

У Вас есть две среды разработки: Хранилище данных (в данном случае ORACLE) и FoxPro.

Каждая среда предполагает определенную идеологию работы. Это означает, что надо постоянно "переключаться" с одной идеологии на другую. Это сложно и трудно. А поскольку FoxPro позволяет использовать Select-SQL, то для простоты Вы сделали вывод: надо везде использовать одинаковые команды. Это проще . Для Вас.

Но это вовсе не означает, что это проще на самом деле.

ORAselectСобственно, это показала мировая практика и тут Ваше мнение вряд ли что изменит.
После такого заявления, обычно предлагается привести "явки и пароли". Знаете ли, после советского воспитания, я слабо верю лозунгам и призывам типа: Я, как и весь трудовой народ... Говори за себя, а "весь трудовой народ" еще неизвестно как думает Как мне кажется, это вовсе не "мировая практика", а Ваше личное мнение.

ORAselectВо-вторых. Явно пишет новичек и именно ему, а не Вам я дал вполне ответственный совет.
Вот именно! Если Вы даете какой-то совет, то аргументируйте его! ПОЧЕМУ надо делать именно так, а не иначе? А лозунги, они лозунги и есть. Рассчитаны не на знание, а на эмоции.

ORAselectВ третьих. И Вам советую применять SQL везде, где можно. Попрактикуете и наверняка согласитесь. Я тоже лет 10 назад подписался бы под вашим ответом.
Применять инструмент надо по назначению . Расхожий штамп: микроскопом гвозди забивать. Ведь можно же! Почему не забивают?

Ну нет никаких аргументов в данном случае в пользу Select-SQL. Не дает он здесь никакого выигрыша. Ни в чем. Ни в понимании, ни в простоте, ни в скорости. Усложение есть, а упрощения - нет.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Ошибка программы / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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