Страница 1 из 2

Вопрос по написанию в MapBasic

Добавлено: 18 сен 2014, 10:28
Inzaim
Добрый день.

Уважаемые форумчане, помогите решить задачу. Постараюсь описать её максимально корректно.
Есть ПО MapInfo 11.0. Как удалось понять есть внутренний язык скриптовый MapBasic. К сожалению я слабо понимаю, что и как программировать, в принципе.
Когда загружается карта, то кликнув правой кнопкой на снимке и выбрав свойства мы видим дополнительную информацию. В данной информации указаны ID_PRODIUCT, DATE_akt, AKT и так далее.
Все данные карты хранятся на сервере, а на сервере их сотни тысяч.
Задача стоит такая. Мы открываем окно с этими полями. Открываем созданный скрипт, который будет спрашивать у нас эти три параметра. Вводим адрес сервера, вводим три параметра, жмем кнопку поиска и открывается окно эксплорера с папкой, содержащей данный файл.
На сервере откровенная каша и бардак из папок и файлов, с разным временем поставки. Хотя есть подобие структуры. На все мои мольбы структуру переделывать оказываются.
В самом имени папки, где возможно лежит файл указывается дата поставки DATE_akt(к примеру сегодня 20140918 (год, месяц, день)). Хотя папок с этой датой может много. Далее в этой папке находится файл с названием ID_PRODIUCT

Прошу помочь решить эту задачу, так как сам совершенно ничего не понимаю в программировании.

Re: Вопрос по написанию в MapBasic

Добавлено: 18 сен 2014, 10:38
trir
Загрузите растры на сервер
http://duncanjg.wordpress.com/2012/11/2 ... is-raster/

Re: Вопрос по написанию в MapBasic

Добавлено: 18 сен 2014, 11:01
Inzaim
К сожалению сделать это невозможно. Все хранится на ленточном архиве. На самом сервере хранятся только файлы, но размером по 1кб.
Логика такая. Мы находим этот файл при помощи скрипта и уже в отдельном ПО запрашиваем загрузку нужного нам файла. Сидим и ждем пока он с ленты прочтется. Архив, примерно в 200 терабайт.

[ Сообщение с мобильного устройства ]

Re: Вопрос по написанию в MapBasic

Добавлено: 18 сен 2014, 11:14
lam
Как вариант, возможности "Геолинка" испробовать под вашу задачу, может быть и скрипт писать не придется.

Re: Вопрос по написанию в MapBasic

Добавлено: 18 сен 2014, 14:48
Inzaim
Уже поднимал этот вопрос, но задачу ограничили в рамках мапинфо.

[ Сообщение с мобильного устройства ]

Re: Вопрос по написанию в MapBasic

Добавлено: 18 сен 2014, 15:09
lam
Inzaim писал(а):Уже поднимал этот вопрос, но задачу ограничили в рамках мапинфо.

[ Сообщение с мобильного устройства ]
"Геолинка" который в мапинфо.

Re: Вопрос по написанию в MapBasic

Добавлено: 19 сен 2014, 01:41
Boris
lam писал(а):
Inzaim писал(а):Уже поднимал этот вопрос, но задачу ограничили в рамках мапинфо.

[ Сообщение с мобильного устройства ]
"Геолинка" который в мапинфо.
я бы даже нескромно так сказал - "Геолинка, уже описанного на форуме"

Re: Вопрос по написанию в MapBasic

Добавлено: 19 сен 2014, 08:03
Inzaim
К сожалению геолинк уже оказался сделанным. Он не может выполнить возложенную задачу. В названиях путей к файлам могут быть и посторонние символы. Так что тут без геолинка надо что-то выдумывать.
Кстати, как батник запустить из мапбейсика?

[ Сообщение с мобильного устройства ]

Re: Вопрос по написанию в MapBasic

Добавлено: 19 сен 2014, 08:24
lam
Inzaim писал(а):В названиях путей к файлам могут быть и посторонние символы. [ Сообщение с мобильного устройства ]
Здесь можно по подробнее?

Re: Вопрос по написанию в MapBasic

Добавлено: 19 сен 2014, 09:15
Донецков
... наверное, что-то из вспомогательных символов, которые нельзя использовать в названиях файлов/каталогов в винде..., тогда смотреть нужно на Linux...

Re: Вопрос по написанию в MapBasic

Добавлено: 19 сен 2014, 10:50
Inzaim
Нет, пути содержат нормальные символы. Директории могут называться как угодно, с кучей постранней инфы. Но всегда в папке есть дата и номер акта.

[ Сообщение с мобильного устройства ]

Re: Вопрос по написанию в MapBasic

Добавлено: 19 сен 2014, 15:04
Inzaim
Вот что получилось. Сделал на основе примеров с сайта mapinfo. Вот тут нашел образец ссылка Далее вписал запрос на ввод переменной AKT. Переменная вставляется в самом низу в строку поиска и производится поиск в имени файла или папки. Вот только поиск идет только в конкретной папке. В подпапках скрипт не ищет. Что очень удручает.
Знаю, что на батниках можно выводить всю структуру папок и подпапок командой dir c:\ /S/B. А чтобы в выводе найти конкретное значение делаем так dir c:\ /S/B |findstr 12345.* Но вот как заставить скрипт искать в подпапках через mapbasic даже не представляю.

Код: Выделить всё

Include "MapBasic.def"
Type FILETIME
	dwLowDateTime As Integer
	dwHighDateTime As Integer
End Type 



Type WIN32_FIND_DATA
    dwFileAttributes As Integer
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Integer
    nFileSizeLow As Integer
    dwReserved0 As Integer
    dwReserved1 As Integer
    cFileName As String * 260
    cAlternate As String * 14
End Type

Define FILE_ATTRIBUTE_DIRECTORY = &H10

Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Integer
Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Integer, lpFindFileData As WIN32_FIND_DATA) As Integer
Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Integer) As Integer

Declare Function FileExists(ByVal Path as String) As Logical
Declare Function GetFileList(ByVal Path as String, FileNames() as String) as Logical

Declare Sub Main()

Function FileExists(ByVal Path As String) As Logical
	Dim hFind As Integer
	Dim wfd As WIN32_FIND_DATA	

	Dim FName As String
	Dim Ret As Integer

	'Get the first file to initialize the find engine
	hFind = FindFirstFile(Path, wfd)
	
	'Trim off any spaces
	FName = LTrim$(RTrim$(wfd.cFileName))

	'No files found
	If Len(FName) = 0 Then
		FileExists = FALSE
	
	Else 'Found it
		FileExists = TRUE
	End If

	'Close the find engine
	Ret = FindClose(hFind)
End Function

Function GetFileList(ByVal Path as String, FileNames() as String) as Logical
	Dim hFind As Integer
	Dim wfd As WIN32_FIND_DATA	
	Dim wfdArray() As WIN32_FIND_DATA ' will use this to reset wfdArray after each use -- avoiding system crash!	

	Dim FName As String
	Dim Ret, i As Integer


	i=0
	ReDim FileNames(i)
	ReDim wfdArray(0)
	ReDim wfdArray(1)

	'Get the first file to initialize the find engine
	hFind = FindFirstFile(Path, wfdArray(1))
	
	'Trim off any spaces
	FName = LTrim$(RTrim$(wfdArray(1).cFileName))

	GetFileList=(Len(FName)>0) ' return "True" if at least one file found

	Do
		i=i+1
		ReDim FileNames(i)
		FileNames(i)=FName
		ReDim wfdArray(0)
		ReDim wfdArray(1)
		Ret = FindNextFile(hFind, wfdArray(1))
		
		'Trim off any spaces
		if Ret=0 then exit do end if
		FName = LTrim$(RTrim$(wfdArray(1).cFileName))
		if FName="" then note "Search failed." exit do end if ' should not happen
	Loop

	'Close the find engine
	Ret = FindClose(hFind)

End Function

Sub Main()

Dim AKT As String
Dialog
Title "Поиск"
Control StaticText
Title "Введите номер АКТа:"
Control EditText
Into AKT
Control OKButton
Control CancelButton
'
'Dim YEAR As String
'Dialog
'Title "Поиск"
'Control StaticText
'Title "Введите ГОД поставки:"
'Control EditText
'Into YEAR
'Control OKButton
'Control CancelButton

'Dim MOUNTH As String
'Dialog
'Title "Поиск"
'Control StaticText
'Title "Введите МЕСЯЦ поставки:"
'Control EditText
'Into MOUNTH
'Control OKButton
'Control CancelButton
'
'Dim DAY As String
'Dialog
'Title "Поиск"
'Control StaticText
'Title "Введите ДЕНЬ поставки:"
'Control EditText
'Into DAY
'Control OKButton
'Control CancelButton

	Dim Ret As Logical
	Dim FName As String
	Dim FileNames() as String
	Dim i as integer
	'run program "cmd /c net use y: \\sonas\FTP\ROOM_DATA\APPSRV03vm\ &"
	FName = "S:\DEP_122_PHOTO\WORK\*" + Str$(AKT) + "*.*"

	Ret = GetFileList(FName, FileNames())

	If Ret = True Then

		for i = 1 to ubound(FileNames())
			print i & ":  " & FileNames(i)
		next

		Note "Total files found:  " & UBound(FileNames())
	else
		note FName + " Doesn't Exist"
	End If

End Sub
Уважаемые, посодействуйте в решении вопроса.

Re: Вопрос по написанию в MapBasic

Добавлено: 13 окт 2014, 09:54
Inzaim
Чувствую, вопрос всех неинтересен.

Re: Вопрос по написанию в MapBasic

Добавлено: 13 окт 2014, 10:07
trir
WinAPI уже неинтересен даже MicroSOFT

Re: Вопрос по написанию в MapBasic

Добавлено: 13 окт 2014, 15:37
SergeyRyzhkov
trir писал(а):WinAPI уже неинтересен даже MicroSOFT
Это точно :)
Но чтобы облегчить страдания, Inzaim , используйте рекурсию