Mais

MapBasic- Mantendo a seleção viva após uma edição?

MapBasic- Mantendo a seleção viva após uma edição?


Eu tenho uma função que é invocada a partir do loop nas linhas selecionadas na tabela de seleção. O procedimento armazenado é invocado e tudo funciona bem para o primeiro registro na seleção, no entanto, após a tabela de seleção ser editada pelo proc armazenado, a seleção no MapInfo torna-se nula. Existe alguma maneira de manter a seleção viva após a primeira edição para que eu possa continuar e executar o procedimento armazenado para a próxima linha na seleção? (ps. Sei que estou atualizando as tabelas no código, mas isso não está sendo atingido no tempo de execução, pois o código insere um 'outro' antes de ser invocado devido à seleção nula:

************************************************** *** 'Create Historical BidBlock "Adicionar região selecionada de mpBidBlocks a mpHistoricalBidBlocks' **************************************************** ******************** sub BidBlock (i_blockID como inteiro) dim SelCount como inteiro dim SelTableName como string dim i_lstCountry, i_contractid, i_type, i_stage, i_MIPRINX como inteiro dim i_RelinqDate como inteiro dim s_CurrentRelinqComments como string dim s_RelinqSchComments as string dim s_CurrentRelinqArea as string dim res como string dim returnResult como string dim returnResultStatus como inteiro dim processo como string process = "moveBidBlock" print chr $ (12) "Certifique-se de que as tabelas de suporte estejam abertas se getSelectionInfo (SelCount , SelTableName) então se SelCount> 0 então se SelTableName = vwBidBlocks então 'Tenha um contrato selecionado' mova para Renúncias e atualize Contratos históricos se isTableOpen (vwHistoricalBidBlocks) então 'tabelas estão abertas' ele precisa salvar se doesTableNeedSave (vwHistoricalBidBlocks) ou não (vwHistoricalBidBlocks) vwBi dBlocks) e observe "Você deve salvar as edições antes de usar esta função!" exit sub end if 'é um polígono if ObjectInfo (Selection.obj, OBJ_INFO_TYPE) = OBJ_TYPE_REGION then' finalmente - o usuário tem este país bloqueado se userHasSelectedCountryLocked () então 'tudo está pronto res = logFile (dataroot + debugfile, "Histórico Bid BlockId: "+ i_BlockID," INF ")" Agora podemos concluir a movimentação histórica do bloco de lances se executeSPReturnResult (process, "declare @out varchar (200), @ Return int exec dbo.pr_moveBidBlock @BLOCKID =" + i_blockId + ", @ MI12 = 'MapInfo', @ NewMI_PRINX = @ Return output, @ Message = @ out output select @ out, @ Return ", returnResult, returnResultStatus) então res = logFile (dataroot + debugfile," Historical BidBlock returnResult: "+ returnResult +" "+ returnResultstatus," INF ")" O resultado da verificação é bom 'se returnresultstatus> = 0 então' atualize as tabelas chame RefreshServerTable (vwBidBlocks, false) chame RefreshServerTable (vwHistoricalBidBlocks, false) res = logFile (dataroot + debugfile, "terminado" + processo, "INF") note "BidBlock histórico concluído para BlockId:" + i_BlockID else note "Falha de BidBlock histórico para BlockId:" + i_BlockID + "possível erro de validação?" end if else note "Erro ao tentar executar" + processo + ", erro retornado:" + returnresult exit sub end if else note "Desculpe, você não tem" + Selection.Country + "bloqueado" end if else note "Você deve selecione um polígono BidBlock "end if else note vwHistoricalBidBlocks +" deve ser aberto "end if else note" Sua seleção deve ser de um BidBlock para realizar um bidblock histórico "end if else note" Você deve selecionar um objeto BidBlock para realizar um bidblock histórico "end if else note" Você precisa selecionar um BidBlock antes de usar esta função "end if end sub

Sim, você precisa armazenar o nome da tabela de seleção e referenciá-la pelo nome em vez de usar o nome especial 'Seleção'. Você pode obter o nome da tabela de seleção usandoSelectionInfo (SEL_INFO_SELNAME). Depois de fazer isso, você precisará usar variáveis ​​Alias ​​para fazer referência aos campos dessa tabela. Além disso, você precisa se certificar de que usaBuscarpara recuperar cada registro ou o cursor nunca se moverá para a próxima linha. Por exemplo:

Dim mySelection as String Dim alRowIDColumn as Alias ​​mySelection = SelectionInfo (SEL_INFO_SELNAME) alRowIDColumn = mySelection & ".RowID" Buscar primeiro de mySelection '// obter o primeiro registro na seleção Do While Not EOT (mySelection) Imprimir "Linha atual:" & alRowIDColumn '// faz coisas com este registro ... Buscar próximo de minhaSeleção' // obtém o próximo registro na seleção Loop

Assista o vídeo: BasicTool demo